Mar*_*osh 4 java aop aspectj code-injection pointcut
我需要使用AspectJ为每个初始化对象注入几个方法.
我想用这个:
pointcut vistaInjection(Object o)
: initialization(java.lang.Object.new() )
&& target(o)
&& !within(objectAspect);
before(Object o): methodInjection(o){System.err.println("INIT");}
Run Code Online (Sandbox Code Playgroud)
切入点对象的初始化,所以我可以将这些方法直接注入到作为每个其他对象一部分的对象中.
但是,它不起作用.你知道为什么吗?或者可能是另一种方式如何100%确定每个初始化对象都是切入点?*.new不适用于字符串,列表和其他内容.
谢谢!
kri*_*aex 18
用户selig是对的:您可能不希望拦截所有对象创建,尤其不是JDK/JRE类中的对象创建.但是,对于它的价值,这里是一个解释什么有效,怎么有,有什么不是:
一点驱动程序应用程序
public class Application {
public static void main(String[] args) {
new Application();
new String();
}
}
Run Code Online (Sandbox Code Playgroud)
具有不同类型的构造函数相关切入点/建议的方面:
public aspect ObjectCreationAspect {
before() : preinitialization(*.new(..)) && !within(ObjectCreationAspect) {
System.out.println(thisJoinPointStaticPart);
}
before() : initialization(*.new(..)) && !within(ObjectCreationAspect) {
System.out.println(thisJoinPointStaticPart);
}
before() : call(*.new(..)) && !within(ObjectCreationAspect) {
System.out.println(thisJoinPointStaticPart);
}
before() : execution(*.new(..)) && !within(ObjectCreationAspect) {
System.out.println(thisJoinPointStaticPart);
}
}
Run Code Online (Sandbox Code Playgroud)
编织驱动程序应用程序的输出:
call(Application())
preinitialization(Application())
initialization(Application())
execution(Application())
call(java.lang.String())
Run Code Online (Sandbox Code Playgroud)
说明:
AspectJ中有不同类型的编织:
现在您可以轻松地从您自己的代码或编织的第三方代码拦截对JDK/JRE构造函数的调用,正如您在日志输出行中所看到的那样call(java.lang.String()).但是,您无法拦截从JRE类到JRE类的内部调用.
说了这么多,我真的很想知道你想做什么样的可怕事情.我的意思是,你解释它,这听起来像一个巨大的设计错误.或者你想重新发明轮子并编写一些已经存在的探查器或调试器.你期望拦截每个单个对象创建什么?它会极大地降低应用程序的速度,大大增加内存消耗并创建更多对象(如果只记录您正在记录的字符串).请重新考虑并尝试考虑你真正想做的事情.也许那时我们可以建议一种实现目标的聪明方法.
| 归档时间: |
|
| 查看次数: |
15130 次 |
| 最近记录: |