2

次のコードを検討してください。

class DatabaseCommands {

    @Privilege(ADMIN)
    public void delete(Something thingToDelete, User currentUser) {
        /* ... */
    }
}

現在、このメソッドにはアクセス チェックが組み込まれてcurrentUserおり、データベース コマンドを実行するために必要な権限があるかどうかを確認します (権限がない場合は例外をスローします)。

新しいメソッドを作成するには、AspectJ ファイルに何を追加する必要がありますか?

public boolean deleteAllowed(Something thingToDelete, User currentUser)

同じアクセス チェックを使用してクラスに追加されますが、コマンドは実行されませんか?

この使用例は、getter/setter をフィールドに追加する場合と似ているようです。

class Foo {
    @Getter @Setter
    String name = ""
}
4

1 に答える 1

4

残念ながら、動的署名を使用してメソッド (AspectJ では Inter Type Declarations と呼ばれる) を追加することはできないため、別のメソッドの名前またはパラメーターに基づいてメソッドを作成する方法はありません。

@Setter @Getter は AspectJ を使用して実装されるのではなく、他の手法を使用して実装されます。Spring Roo は実際にソース コードを検査し、アスペクトのソースを生成します。次に、それがコンパイルされ、元のクラスに適用されます。Project Lombok などは、ASM、BCEL、または APT を直接使用して Java バイトコードを計測します。ASM は、AspectJ 自体が (AspectJ の用語では Weave) .class ファイルを変更するために使用するツールキットと同じですが、直接使用すると、AspectJ よりもはるかに柔軟 (かつはるかに複雑) になります。APT は Sun の Annotation Processing Tool であり、Java 6 以降は Java コンパイラに「組み込まれています」。Javacが特定の注釈を持つメソッドまたはクラスをコンパイルしている瞬間を「インターセプト」するために使用でき、ゲッター/セッターのペアまたは別の新しいメソッドを含む新しいコードを「注入」するために使用できます。

于 2011-07-25T22:07:49.967 に答える