Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 动态类加载在运行时失败_Java_Exception_Dynamic_Classloader - Fatal编程技术网

Java 动态类加载在运行时失败

Java 动态类加载在运行时失败,java,exception,dynamic,classloader,Java,Exception,Dynamic,Classloader,我有以下java代码片段: final Class<?> junitCoreClass = AccessController.doPrivileged( new PrivilegedAction<URLClassLoader>() { @Override public URLClassLoader run() { return new URLClassLoader(new URL[] { junitJarUrl });

我有以下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();

您不需要执行
.loadClass(“org.junit.runner.JUnitCore”,**true**)或在创建新实例之前调用类对象上的resolveClass()。

问题在于,主类是由类路径上没有JUnit的系统类加载器(包含-classpath的加载器)加载的。然后,创建一个单独的类装入器,该类装入器在类路径上只有JUnit。当主类尝试强制转换到JUnitCore时,系统类加载器被要求加载它不包含的JUnitCore,因此发生NoClassDefFoundError


如果不使用反射,就没有一种方便的方法来完成您想要做的事情。您需要(1)创建一个直接访问JUnitCore的单独类,(2)在URLClassLoader(目录或JAR)上包含该类的路径,(3)使用反射加载该类,以及(4)使用反射调用该类上的方法。

我不知道您在说什么,因为Java 6在ClassLoader.loadClass()和Class.resolveClass()方法上都没有第二个参数。ClassLoader.loadClass确实有第二个布尔参数,但该方法不是公共的。ClassLoader.resolveClass已存在。这就是说,两者都与这个问题无关,所以我同意否决票。请给我们看一下例外情况的完整stacktrace。我担心的是:-/。谢谢你精心设计的答案。 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]