我在下面的示例代码中描述了我的问题。 HelloWorld
类是我的源代码,需要由 HelloWorldTracer
切面进行检测。我的目标是查找所有位于 HelloWorld.main()
控制流程中的方法调用。但我不关心与 java.lang.* 包中任何类型相关的方法调用(例如:java.lang.StringBuilder
)。
package com.abc;
public class HelloWorld {
public static void main(String args[]) {
StringBuilder str = new StringBuilder();
str.toString();
Sample.testMethod();
}
}
package com.abc;
public class Sample {
public static void testMethod()
{
StringBuilder str = new StringBuilder();
str.toString();
}
}
public aspect HelloWorldTracer {
pointcut helloWorldTracker() :
execution(* com.sybase.HelloWorld.main(..)) && within(com.abc..*) && !within(HelloWorldTracer);
pointcut methodTracker():
cflow(helloWorldTracker())
&& !within(java.lang..*) && !within(HelloWorldTracer);
Object around(): methodTracker()
{
System.out.println("Inside advice..." + thisJoinPointStaticPart.getSignature().toString() );
Object o = proceed();
return o;
}
}
使用上述切点时,尽管在methodTracker()
切入点中明确指定了!within(java.lang..*)
,但仍会建议使用StringBuilder
类型。我还尝试过!within(java.lang.StringBuilder)
和!execution(String java.langStringBuilder.toString(..))
,但都没有成功。欢迎任何帮助我限制从java.lang..*获取建议的类型。