使用引用编译动态加载的类

时间:2012-03-29 05:00:26

标签: java dynamic compiler-construction classloader

首先假设我有一个抽象类,我们称之为AbstractClass。假设

public abstract AbstractClass {
    public abstract void F();
}

假设我有一个类,我们称之为ClassA。 ClassA扩展了AbstractClass。 ClassA保存在文件夹中。 (它必须加载到类路径中。)现在假设我正在程序中编写一个新类,

ClassB

我希望ClassB能够引用ClassA。

的内容
public class ClassB extends AbstractClass {

    ClassA A = new ClassA();

    public void F() {
         A.F();
    }

}

现在,我使用类加载器获取classA并动态使用它没有任何问题。我根据用户输入动态编写类似ClassA的类,在程序中编译它(使用ecj.jar),然后加载它并从中调用方法也没有问题。

我无法弄清楚如何在我正在编写和动态编译的类中引用动态加载的类。我不知道如何编写导入等等。加载classA并放入

导入classA;

进入classB.java文件不起作用。

这是我在StackOverflow(长时间阅读器)上的第一个问题,所以请放轻松。提前谢谢。

-

上下文:使用用户输入的概率分布的程序。我有一个抽象类AbstractDistribution,它有分布的CDF,PDF,逆CDF等的抽象方法。到目前为止,这已经运行良好,动态编写和加载扩展AbstractDistribution的分布,获取它们的newInstance()并使用它们像任何其他课程。但是,如果我已经编写并动态加载了分发Dist1,我希望能够编写一个可以调用(例如)Dist1的PDF的Dist2。

1 个答案:

答案 0 :(得分:2)

不要让B直接引用A - 让B引用AbstractClass并在其构造函数中引用一个实例:

public class ClassB extends AbstractClass {

    private final AbstractClass other;

    public ClassB(AbstractClass other) {
        this.other = other;
    }

    public void F() {
         other.F();
    }    
}

此时你需要弄清楚你将如何获得对AbstractClass的另一个实例的引用(无论它是ClassA还是别的什么)但它确实摆脱了直接依赖。

我确信会有更多确切的细节可以解决,但是如果你可以打破这样的直接依赖,它应该使动态编译方面不再是一个问题。