我如何编译&当它具有项目依赖性时,以编程方式从源实例化Java类?

时间:2015-12-30 17:33:41

标签: java reflection dynamic-loading

This is great,但是如果未编译源中的类应该从项目特定类(已经加载)继承并具有其他项目依赖性呢?

作为一个例子,假设我想让我的软件用户能够在运行时自定义一个类。我的项目中有一个abstract public class Customizable和一个自定义class StatusDetails,让我们说用户将代码写入一个如下所示的文件中:

import com.somepackage.util.StatusDetails;

public class Test extends Customizable {

    public Test(){
        System.out.println("Initializing Test");
    }

    @Override
    public StatusDetails getStatus(Object params){
        StatusDetails status = new StatusDetails();
        // Populate status based on params
        return status;
    }
}

我怎么能接受并实例化呢?

1 个答案:

答案 0 :(得分:0)

首先需要编译该类,这意味着您必须提供所需的JAR文件并提供类路径。为了解决这个问题,我强烈推荐Apache的Maven,但学习曲线会让你有所回首。好消息是,在学习曲线之后,您将拥有一个非常好的构建工具,它是完全可移植的,非常适合管理Java项目。

然后,您需要将输出JAR文件/类放在正在运行的程序的类路径上并重新启动它。

还有其他方法可以解决这个问题,每个方法都有一点困难。您可以使用类加载器避免重新启动,并让程序动态加载类以响应用户操作。

通过调用编译器工具界面,编译程序然后使用上面提到的自定义类加载器将其合并到正在运行的程序中,您可以通过将构建链放入程序本身来避免构建链的外部化。

这种方法的问题(如上所述)很多。基本上你给每个人一个巨大的安全漏洞。例如,我可以“加载”破坏文件系统的代码,或者打开网络套接字来攻击其他机器。

我建议使用单独的构建链和手动配置负载,并重新启动。它可能会让用户跳过更多的箍,但它会使安全漏洞不被轻易利用。