首页 / JAVA / java-动态类加载在运行时失败
java-动态类加载在运行时失败
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-动态类加载在运行时失败,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1886字,纯文字阅读大概需要3分钟。
内容图文
![java-动态类加载在运行时失败](/upload/InfoBanner/zyjiaocheng/652/d6cdbdcafd9a4d3887370526bfc3637b.jpg)
我有以下Java代码段:
final Class<?> junitCoreClass = AccessController.doPrivileged(
new PrivilegedAction<URLClassLoader>() {
@Override
public URLClassLoader run() {
return new URLClassLoader(new URL[] { junitJarUrl });
}
}).loadClass("org.junit.runner.JUnitCore");
System.out.println(junitCoreClass.getName());
final JUnitCore junitCore = (JUnitCore) junitCoreClass.newInstance();
这样编译就可以了.但是,当我尝试运行它时,会发生一些奇怪的事情.在最后一行抛出java.lang.NoClassDefFoundError,引用刚刚加载的类.奇怪的是,println打印确切的类名.
我检查了一下是否将新的实例引用保留为Object并仅通过反射对其进行操作,一切都很好,因此,令人讨厌的代码段必须是显式的强制转换.
有人可以向我解释为什么会发生这种情况,还可以告诉我如何实现自己的目标吗?
PS:对于那些想要查看更近的堆栈轨迹的人来说,没有什么值得展示的:
java.lang.NoClassDefFoundError: org/junit/runner/JUnitCore at [last line of example) [lines from my app] Caused by: java.lang.ClassNotFoundException: org.junit.runner.JUnitCore at java.net.URLClassLoader$1.run(URLClassLoader.java:200) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:188) at java.lang.ClassLoader.loadClass(ClassLoader.java:315) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:330) at java.lang.ClassLoader.loadClass(ClassLoader.java:250) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:398) at [last line of example] [lines from my app]
解决方法:
问题是您的主类是由在类路径上没有JUnit的系统类加载器(包含-classpath的加载器)加载的.然后,创建一个单独的类加载器,该类加载器在类路径上仅具有JUnit.当您的主类尝试转换为JUnitCore时,系统类加载器将被要求加载JUnitCore(它不包含该类),因此发生NoClassDefFoundError.
如果不使用反射,就没有便捷的方法来执行您要执行的操作.您将需要(1)创建一个单独的直接访问JUnitCore的类,(2)在URLClassLoader(目录或JAR)上包含该类的路径,(3)使用反射来加载该类,以及(4)使用反射来在该类上调用一个方法.
内容总结
以上是互联网集市为您收集整理的java-动态类加载在运行时失败全部内容,希望文章能够帮你解决java-动态类加载在运行时失败所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。