繁体   English   中英

当Java类具有项目依赖性时,如何通过编程方式从源代码中编译和实例化Java类?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM