[英]How do I compile & instantiate a Java class from source programmatically when it has project dependencies?
很好 ,但是如果未编译源代码中的类应从项目特定的类(已加载)继承并具有其他项目依赖项,该怎么办?
例如,假设我想让我的软件用户能够在运行时自定义类。 我的项目中有一个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;
}
}
我该如何接受并实例化它?
首先,需要编译该类,这意味着您将必须交付所需的JAR文件并提供类路径。 为了解决这个问题,我强烈建议使用Apache的Maven,但是学习过程会让您有点后退。 好消息是,经过学习后,您将拥有一个非常好的构建工具,该工具完全可移植,非常适合管理Java项目。
然后,您需要将输出的JAR文件/类放在正在运行的程序的类路径中,然后重新启动它。
还有其他解决方法,每种方法都有一些难度。 您可以通过使用类加载器来避免重新启动,并让程序响应用户操作来动态加载类。
通过将构建链放入程序本身,调用编译器工具接口,编译程序,然后使用上述自定义类加载器将其合并到运行的程序中,可以避免构建链的外部化。
这种方法(如上所述)存在许多问题。 基本上,您给每个人一个巨大的安全漏洞,可供利用。 例如,我可以“加载”破坏文件系统的代码,或打开网络套接字以攻击其他计算机。
我建议使用单独的构建链和手动配置负载,并要求重新启动。 它可能使用户跳了几圈,但它会使安全漏洞不容易被利用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.