【问题标题】:Compile with a reference a dynamically loaded class使用引用编译动态加载的类
【发布时间】:2012-03-29 05:00:26
【问题描述】:

首先假设我有一个抽象类,我们称它为 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。

【问题讨论】:

  • 为什么B类不能扩展A类?
  • @jasonw,上面的例子是一个非常精简的例子。假设我有 ClassA1 和 ClassB1,我可能想要 `class ClassB { ClassA1 A1 = new ClassA1(); ClassA2 A2 = new ClassA2();公共无效 F() { A1.F(); A2.F(); } } `
  • 好的,Richard,我希望一些大师能在这里阐明一些观点:-)

标签: java dynamic compiler-construction classloader


【解决方案1】:

不要让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 还是其他),但它确实摆脱了直接依赖.

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

【讨论】:

  • 感谢@JohnSkeet。这不是我想要的,因为我希望用户能够在参考中进行硬编码。也就是说,我有 JTextFields,它们基本上定义了要写入新类和编译的不同方法的内容。例如,如果ClassA 已经被动态写入和加载,我希望他们能够编写类似new ClassA().F() 的东西并进行编译。这可能是不可能的。 :(
  • @richard:是的,只要您在编译中使用的类路径中包含动态编译的类。你还没有过多地谈论编译步骤。
  • 我让它工作了;您对编译器的类路径是正确的。一旦我将-classpath [directory with dynamically written classes] 传递给JavaCompiler.getTask(...) 函数的options 参数,它完美地工作。谢谢。现在已经解决了,我必须处理管理我的用户可能创建的跨类依赖项的噩梦......
猜你喜欢
  • 2011-09-03
  • 2013-03-26
  • 2011-12-17
  • 2017-04-20
  • 2011-02-19
  • 2011-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多