【发布时间】:2021-09-14 12:40:19
【问题描述】:
我将以下遗留代码迁移到 Java 16,但是由于这个新版本引入的强封装,它不起作用:
try {
Method method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
method.setAccessible(true);
method.invoke(new URLClassLoader(
new URL[] {}),
new File("C:/external-folder/my.jar").toURI().toURL()
);
} catch (Exception exc) {
exc.printStackTrace();
}
有没有办法让它工作?
【问题讨论】:
-
不要破解系统类加载器,而是将您的外部 .jar 文件重构为 service provider。
-
您正在使用此内部 API 将 JAR 添加到类路径中。根据您这样做的原因,有更好的(即支持的)方法来实现您的目标。您介意解释一下为什么需要添加该 JAR 吗?
-
这是一个老代码,在运行时编译一个类,以后还要加载它
-
您应该只使用其他方式加载该类,例如单独的类加载器。但是如果你想在下一个 java 版本中再次破解和修复它,你可以使用很多方法:instrumentation、unsafe、通过 unsafe 访问的内部查找
标签: java reflection java-16 java-17