我需要使用AspectJ向每个初始化的对象注入一些方法。
我以为是这样的:
pointcut vistaInjection(Object o)
: initialization(java.lang.Object.new() )
&& target(o)
&& !within(objectAspect);
before(Object o): methodInjection(o){System.err.println("INIT");}
指向对象的切入点初始化,因此我可以将这些方法直接注入到每个其他对象的对象中。
但是,它不起作用。你知道为什么吗?还是另一种方法可以如何100%确保每个初始化的对象都将成为切入点?* .new不适用于String,List等。
谢谢!
用户selig是正确的:您可能不想截取 所有 对象,尤其是JDK /
JRE类中的对象。但是,对于它的价值而言,这里是对什么有效,如何以及什么无效的解释:
一些驱动程序应用程序:
public class Application {
public static void main(String[] args) {
new Application();
new String();
}
}
具有不同类型的构造函数相关切入点/建议的方面:
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);
}
}
编织驱动程序应用程序的输出:
call(Application())
preinitialization(Application())
initialization(Application())
execution(Application())
call(java.lang.String())
说明:
AspectJ中有不同的编织类型:
现在,您可以轻松地从您自己的代码或编织的第三方代码截取对JDK / JRE构造函数的 调用
,如您在日志输出行中所看到的call(java.lang.String())
。但是,您不能截获从JRE类到JRE类的内部调用。
说了这么多,我真的很想知道您想做哪种可怕的事情。我的意思是,您解释一下,这听起来像是一个巨大的设计错误。或者,您想重新发明轮子并编写某种已经存在的探查器或调试器。您对拦截每个对象的创建有何期待?如果仅记录字符串,那么它将极大地降低应用程序的速度,显着增加内存消耗并创建更多对象。请重新考虑并尝试考虑您真正想要做什么。也许那么我们可以建议实现目标的明智方法。
对象的切入点初始化,所以我可以直接将这些方法注入到作为每一个其他对象的一部分的对象中。 然而,它不起作用。你知道为什么吗?或者有什么其他方法可以100%地确保每个初始化的对象都是切入点?*.new不适用于字符串、列表等内容。 谢谢!
这就是我的目标: 这是我的Aspect类: 如何为构造函数对象创建切入点?
类 类是对某一事物的抽象描述,具体地讲,类是C++中的一种构造的数据类型。它即可包含描述事物的数据,又可包含处理这些数据的函数,类在程序运行时是被用作样板来建立对象的。所以要建立对象,首先必须定义类。 定义类 定义一个类的一般格式为: class 类名{ private: 成员表1; public: 成员表2; protected:
我就是不明白为什么我的切入点不起作用。编译器并没有给出任何警告,所以我无法解释它为什么不工作。我正在maven javafx应用程序中使用aspectjrt 1.7.2和aspectjtools 1.7.0。 我的样子是这样的 我的电影方面位于包主要。模型 下面是对我的代码中实际发生的事情的一点解释 当我的gui加载时,我初始化MainFrame类。在此之前,另一个方面加载所有电影对象。然后,当主
是否有一种方法可以使用spring来指向cut hibernate实体。 这是我发现的,但没有解决办法
在尝试向CDI bean(ApplicationScoped)的构造函数中注入参数时,我遇到了以下问题: 但是,我在类上确实有一个可注入的构造函数: 有什么想法这里出了什么问题吗?