是否有可能實現這一目標使用AOP庫,例如AspectJ的?
是的,當然。這是一種典型的初學者的AspectJ中的運動,像這樣:
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);
}
}
現在你只需要編寫可截取你的所有方法執行方面(以及可選的構造函數執行,如下圖所示):
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