Run*_*ror 5 java jar classloader urlclassloader java-9
我有一个类加载器问题与Java 9。
这段代码可用于以前的Java版本:
private static void addNewURL(URL u) throws IOException {
final Class[] newParameters = new Class[]{URL.class};
URLClassLoader urlClassLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
Class newClass = URLClassLoader.class;
try {
Method method = newClass.getDeclaredMethod("addNewURL", newParameters );
method.setAccessible(true);
method.invoke(urlClassLoader, new Object[]{u});
} catch (Throwable t) {
throw new IOException("Error, could not add URL to system classloader");
}
}
Run Code Online (Sandbox Code Playgroud)
从这个线程中,我了解到必须将其替换为以下内容:
Class.forName(classpath, true, loader);
loader = URLClassLoader.newInstance(
new URL[]{u},
MyClass.class.getClassLoader()
Run Code Online (Sandbox Code Playgroud)
MyClass是我要在其中实现该Class.forName()方法的类。
u = file:/C:/Users/SomeUser/Projects/MyTool/plugins/myNodes/myOwn-nodes-1.6.jar
String classpath = URLClassLoader.getSystemResource("plugins/myNodes/myOwn-nodes-1.6.jar").toString();
Run Code Online (Sandbox Code Playgroud)
由于某些原因-我真的不知道为什么-在运行时我收到ClassNotFoundException Class.forName(classpath, true, loader);
有人知道我在做什么错吗?
来自以下文档Class.forName(String name, boolean initialize, ClassLoader loader):-
throws
ClassNotFoundException- 如果指定的类加载器无法找到该类
另请注意,用于 API 的参数包括类的名称,类加载器使用该名称返回类的对象。
给定类或接口的完全限定名称(与 getName 返回的格式相同),此方法尝试定位、加载和链接类或接口。
在您的示例代码中,可以将其纠正为:
// Constructing a URL form the path to JAR
URL u = new URL("file:/C:/Users/SomeUser/Projects/MyTool/plugins/myNodes/myOwn-nodes-1.6.jar");
// Creating an instance of URLClassloader using the above URL and parent classloader
ClassLoader loader = URLClassLoader.newInstance(new URL[]{u}, MyClass.class.getClassLoader());
// Returns the class object
Class<?> yourMainClass = Class.forName("MainClassOfJar", true, loader);
Run Code Online (Sandbox Code Playgroud)
上述代码中的位置MainClassOfJar应替换为 JAR myOwn-nodes-1.6.jar的主类。