例如,现在我想拦截AOP的java.lang.String方法split()。
有可能吗?
我尝试了一些常规方法,但它没有用。
@Aspect
public class TestAspect {
@Before ("execution (* java.lang.String.split(..))")
public void logBeforeString(JoinPoint joinPoint) {
System.out.println("SPLIT BEGIN");
}
}
以下是配置文件:
<!-- Aspect -->
<aop:aspectj-autoproxy />
<beans:bean id="TestAspect" class="com.dong.partner.aspect.TestAspect" />
在我自己的项目中使用其他切入点,它们可以顺利运行。
所以任何人都知道如何拦截导入的外部包?
答案 0 :(得分:0)
不,使用execution
可以建议java.lang中没有任何内容。请参阅this question for a more detailed explanation。
所以任何人都知道如何拦截导入的外部包?
您正在使用<aop:aspectj-autoproxy />
,这意味着Spring正在使用基于代理的AOP。从本质上讲,如果使用AOP建议bean,Spring会在每个bean周围创建一个包装器。当调用其中一个bean的方法时,它首先命中代理/包装器。代理决定它是应该直接调用你的bean还是应该调用一个或多个方面。
您可以使用基于代理的AOP limits to the type of advice。要拦截从代码到非bean类的调用,您需要切换到编译时或加载使用aspectj编织的时间并使用call pointcuts而不是execution
切入点。 aspectj编译器将重新调整您的字节码,以便重写从代码到java.lang.String的任何调用以调用call
切入点。
有趣的是,this question遇到了您遇到的相反问题。