Java URLClassLoader调用外部程序后获取依赖类静态字段问题
问题解决方法
一、先排查类名拼写错误
你代码里写的AnoterhClassName是明显的拼写错误(正确应为AnotherClassName),这大概率是触发ClassNotFoundException的直接原因,先修正拼写后再尝试加载。
二、通过主类关联字段直接获取依赖类的Class对象
既然MyMainClass已成功加载并使用了AnotherMyClass的静态字段,无需手动调用Class.forName重新加载,直接从MyMainClass中提取关联字段的类型即可:
// 假设MyMainClass中引用AnotherMyClass静态字段的变量名为targetStaticField Field targetField = classToLoad.getDeclaredField("targetStaticField"); // 获取该字段的类型,即为你需要的AnotherMyClass的Class对象 Class<?> anotherClass = targetField.getType(); // 提取静态字段的值(静态字段无需实例,传null即可) Object staticFieldValue = targetField.get(null);
三、使用主类的类加载器加载依赖类
如果上述方法不适用,可借助MyMainClass实际使用的类加载器来加载依赖类,避免类加载器不一致问题:
// 获取MyMainClass的类加载器 ClassLoader actualClassLoader = classToLoad.getClassLoader(); // 用该类加载器加载目标依赖类 Class<?> anotherClass = Class.forName("com.anotherproject.AnotherMyClass", true, actualClassLoader);
四、替代方案:显式添加所有依赖JAR到URLClassLoader
若依赖JAR不在系统类路径或主JAR的Class-Path范围内,手动将依赖JAR路径加入URLClassLoader的URL数组:
String dependencyJarPath = "/path/to/anotherproject.jar"; URL[] urls = new URL[]{ new URL("jar:file:" + ProgramLocation +"!/"), new URL("jar:file:" + dependencyJarPath +"!/") }; URLClassLoader cl = URLClassLoader.newInstance(urls, getClass().getClassLoader());
内容的提问来源于stack exchange,提问作者Igor Adamovich
相关产品推荐
相关产品推荐

