为什么在Java中这么难做到这一点?如果你想拥有任何类型的模块系统,你需要能够动态加载JAR文件.有人告诉我,有一种方法可以通过编写自己的ClassLoader
来实现这一点,但这需要做大量的工作,至少在我看来,这应该像用JAR文件作为参数调用方法一样简单.
对于执行此操作的简单代码,有什么建议吗?
为什么在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);
很痛苦,但就是这样.