JJB*_*JJB -2 java reflection java-16 java-17
我将以下遗留代码迁移到 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();
}
Run Code Online (Sandbox Code Playgroud)
有办法让它发挥作用吗?
Bri*_*etz 25
问题不在于反射“不起作用”;而在于反射“不起作用”。反射最终强制执行编译器和运行时一直强制执行的更多可访问性模型。 URLClassLoader::addUrl
仅适用于子类;它不适合从实现外部访问,而这正是您正在做的事情。随着时间的推移,从 Java 9 开始一直到后续版本(包括 17),访问限制越来越多地通过反射来识别,并发出警告,从而使损坏的代码有机会迁移到可支持的代码。
所讨论的代码实际上只是意外地工作过;它取决于能否闯入不受支持的接口。使用setAccessible
应该是一个线索。当然,你可以通过打破窗户进入锁着的房子,但如果你必须打破窗户(而且它\xe2\x80\x99不是你的房子),你应该意识到问题出在哪里。
把它看作是半满的玻璃杯;这个意外工作的代码工作了很长时间。但账单已经到期了;是时候修复你的代码了。
\nNic*_*lai 10
代码非常奇怪。乍一看,我认为它使用反射来访问URLClassLoader
内部以添加myJar
到现有的类加载器,但实际上它使用它来将其添加到新的类加载器。没有理由这样做——你可以只使用构造函数URLClassLoader
。
它应该看起来像这样(未经测试,因为我远离 IDE):
URL jar = new File("C:/external-folder/my.jar").toURI().toURL();
URL[] urls = { jar };
new URLClassLoader(urls);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
10316 次 |
最近记录: |