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

问题描述 投票:0回答:1

首先假设我有一个抽象类,我们称之为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并放置

导入A类;

进入 classB.java 文件并不能解决问题。

这是我在 StackOverflow(长期读者)上的第一个问题,所以请放轻松。 预先感谢。

--

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

java dynamic classloader
1个回答
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
还是其他东西),但它确实摆脱了直接依赖。

我确信会有更准确的细节需要解决,但是如果你可以像这样打破直接依赖关系,它应该会使动态编译方面的问题减少。

© www.soinside.com 2019 - 2024. All rights reserved.