为什么在Java中这么难做到这一点?如果你想拥有任何类型的模块系统,你需要能够动态加载JAR文件.有人告诉我,有一种方法可以通过编写自己的ClassLoader来实现这一点,但这需要做大量的工作,至少在我看来,这应该像用JAR文件作为参数调用方法一样简单.

对于执行此操作的简单代码,有什么建议吗?

推荐答案

难的原因是安全.类加载器应该是不可变的;您不应该能够在运行时随意向其添加类.实际上,我非常惊讶这能与系统类加载器一起工作.下面是制作您自己的子类加载器的方法:

URLClassLoader child = new URLClassLoader(
        new URL[] {myJar.toURI().toURL()},
        this.getClass().getClassLoader()
);
Class classToLoad = Class.forName("com.MyClass", true, child);
Method method = classToLoad.getDeclaredMethod("myMethod");
Object instance = classToLoad.newInstance();
Object result = method.invoke(instance);

很痛苦,但就是这样.

Java相关问答推荐

当在具有约束布局的AlertDialogue内部使用时,回收器视图布局宽度很奇怪

使用log 4j2格式的Hibernate 显示SQL日志(log)

H2弹簧靴试验跌落台

SpringBootreact 式Web应用程序的Spring Cloud Configer服务器中的资源控制器损坏

获取字符串中带空格的数字和Java中的字符

为什么在maven中,getLast方法不适用于List?

PDFBox未加载内容

在Java 17中使用两个十进制数字分析时间时出错,但在Java 8中成功

如何使用log4j2(Json)记录由";异常引起的所有";?

Spring Boot中的应用程序.properties文件中未使用的属性

如何在IntelliJ IDEA的Build.sbt中添加外部JAR文件?

Spring Validator批注不起作用

每次我需要时创建和关闭数据库连接会有什么效果吗?

为什么我不能建立输入/输出流?Java ServerSocket

为什么项目名称出现在我的GET请求中?

如何使用WebEnvironment.RANDOM_PORT获得第二个随机端口?

无法使用Open WebStart Java 8运行jnlp

如何设计包含已知和未知键值对映射的Java类?

如何使JOOQ渐变脚本不重新创建表未更改的类?

将@Transactional添加到Spring框架中链下的每个方法会产生什么效果?