0

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

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
    }
}

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

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

我希望我可以用两个参数调用它: new Driver("paramA", "paramB")

相反,我需要使用三个参数来调用它: new Driver("paramA", "paramB", new NewConstructor())

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

4

1 回答 1

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 类和方面是否在不同的项目中?您是否使用方面路径和/或路径?您是否使用加载时间编织?

如果在完成项目的完整构建后您仍然看到问题,那么值得为 AspectJ 提出一个错误

于 2013-05-13T16:17:39.127 回答