通过AspectJ将新构造函数添加到现有Java类

时间:2013-05-13 14:46:35

标签: aspectj

尝试清理一些讨厌的代码,我们没有源代码。想象一下这样的事情:

public class Driver{

    private String paramA;
    private String paramB;

    new Driver(HugeAndOverbloatedObject object)     
    {
         paramA = object.getSubObject4711().getParamX();
         paramB = object.getSubObject4712().getParamY();
    }

}

第三个库到处都是这样的:通过构造函数进行紧耦合,尽管类很难相关。私有成员和强制构造函数继承的粗暴组合使得代码的扩展几乎不可能,而不会创建“草率”构造函数参数对象。

所以我试图通过AspectJ操作类并编译时间编织,所以我可以减少构造函数,这样:

Driver driver = new Driver("paramA", "paramB");

我认为这应该是可能的,而且我已经取得了一些进展。如果我有这样的事情:

public aspect NewConstructor {
    Driver.new(String parameterA, String parameterB){
        //New Constructor Code
    }
}

并通过weaver运行我实际上在驱动程序中找到了一个新的构造函数,但并不像我预期的那样。

问题:编织类中的意外第三个参数

我希望我能用两个参数调用它:     新驱动程序(“paramA”,“paramB”)

相反,我需要用三个参数调用它:     新驱动程序(“paramA”,“paramB”,新的NewConstructor())

为什么我需要实例化方面的新实例并将其作为参数传递?这可以预防吗?

1 个答案:

答案 0 :(得分:0)

这里发生了奇怪的事。您不应该将方面添加为构造函数的第三个参数。事实上,当我使用下面的类和方面自己尝试时,我没有得到任何编译错误:

Java类:

包装;

public class Driver {
    public static void main(String[] args) {
        new Driver("paramA", "paramB");
    }
}

方面:

package pack;

public aspect NewConstructor {
    public pack.Driver.new(String parameterA, String parameterB){
    }
}

您的Java类和方面是否在不同的项目中?您使用的是方面路径和/或路径吗?你在使用加载时间编织吗?

如果完成项目的完整构建后仍然可以看到探测器,那么它值raising a bug for AspectJ