それはAspectJのように、この使用してAOPライブラリを達成することは可能ですか?
ええ、確かに。 (以下に示すように、必要に応じても、コンストラクタの実行)
public class SampleClass {
public SampleClass() { super(); }
public SampleClass(String s) { this(); }
public SampleClass(int i) { this(); }
public void method01(String s, Number n, Throwable t) {}
public void method02(int i, String s, double d) {}
public void method03(String s) {}
public void method04() {}
public void method05(String s, Number n, double d) {}
public static void main(String[] args) {
new SampleClass().method01("foo", new Integer(11), new RuntimeException("error"));
new SampleClass("test").method02(11, "bar", Math.PI);
new SampleClass(123).method03("zot");
new SampleClass("another test").method04();
new SampleClass(456).method05("baz", new Integer(11), Math.E);
}
}
が今、あなただけのすべてのメソッドの実行をインターセプト側面を記述する必要があります:
これは、AspectJの中に、典型的な初心者の運動の種類、そのようなものです
public aspect MethodArgsAspect {
pointcut allMethods() : execution(* *(..));
pointcut allConstructors() : execution(*.new(..));
before() : !within(MethodArgsAspect) && (allMethods() || allConstructors()) {
System.out.println(thisJoinPointStaticPart.getSignature());
for (Object arg : thisJoinPoint.getArgs())
System.out.println(" " + arg);
}
}
SampleClass.main
を実行している場合は、この態様は印刷されます:
void SampleClass.main(String[])
[Ljava.lang.String;@7fdcde
SampleClass()
void SampleClass.method01(String, Number, Throwable)
foo
11
java.lang.RuntimeException: error
SampleClass()
SampleClass(String)
test
void SampleClass.method02(int, String, double)
11
bar
3.141592653589793
SampleClass()
SampleClass(int)
123
void SampleClass.method03(String)
zot
SampleClass()
SampleClass(String)
another test
void SampleClass.method04()
SampleClass()
SampleClass(int)
456
void SampleClass.method05(String, Number, double)
baz
11
2.718281828459045
uは、単一のメソッドにパラメータとして来て任意の数の引数を印刷しようとしていますか? –
はい、アプリケーションのキャッシュレイヤーを設計しています。クラス名、メソッド名、引数、および注釈(CacheForMinute)をキーとして使用したいと考えています。 – aryaxt