如何编译&;当Java类具有项目依赖项时,是否以编程方式从源代码实例化它?

如何编译&;当Java类具有项目依赖项时,是否以编程方式从源代码实例化它?,java,reflection,dynamic-loading,Java,Reflection,Dynamic Loading,,但如果未编译源中的类继承自特定于项目的类(已加载),并且具有其他项目依赖项,该怎么办 例如,我想让我的软件用户能够在运行时自定义类。在我的项目中,我有一个可自定义的抽象公共类和一个自定义的类StatusDetails,假设用户在如下文件中编写代码: import com.somepackage.util.StatusDetails; public class Test extends Customizable { public Test(){ System.out.

,但如果未编译源中的类继承自特定于项目的类(已加载),并且具有其他项目依赖项,该怎么办

例如,我想让我的软件用户能够在运行时自定义类。在我的项目中,我有一个可自定义的
抽象公共类
和一个自定义的
类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文件/类放在运行程序的类路径上,并重新启动它


还有其他方法,每种方法都有一点难度。您可以通过使用类加载器避免重新启动,并让程序动态加载类以响应用户操作

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

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


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

我真的认为没有必要这样做。你能详细解释一下吗?@Bumbolt希望我的补充是有意义的……有点。我将跟随,只是因为我有兴趣看到一个人将如何做到这一点。尽管如此,我并没有看到任何软件在运行时针对许多安全问题这样做的好处。也许只有我;)其目标是在运行时进行逻辑更改,而不必关闭整个系统并重新启动。在某些情况下,例如软件在用户机器上独立运行时,安全性可能不是问题。显然,将此作为设计参数,目标用户是开发人员。当然他们可以把事情搞砸,但这是他们自己的系统。他们也可以通过运行自己的程序来轻松地解决问题。“您可以通过使用类加载器来避免重新启动,并让程序根据用户操作动态加载类。”这基本上就是我想要做的。不过,我不太明白你建议的方法。此外,您提到的安全漏洞在某些情况下不是问题。尤其是当软件在用户机器上独立运行时。