Java CustomerClassLoader:NoClassDefFoundError

Java CustomerClassLoader:NoClassDefFoundError,java,class,classloader,Java,Class,Classloader,当我试图将.class文件加载到JUnitCore.runClasses(…)中时,我一直在使用CustomerClassLoader但是我得到了以下错误 Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: SimpleTest (wrong name: JUnit/SimpleTest) at java.lang.ClassLoader.defineClass1(Native Method) at jav

当我试图将.class文件加载到
JUnitCore.runClasses(…)中时,我一直在使用CustomerClassLoader但是我得到了以下错误

Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: SimpleTest (wrong name: JUnit/SimpleTest)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:791)
at java.lang.ClassLoader.defineClass(ClassLoader.java:634)
at Java.CustomClassLoader.access$000(CustomClassLoader.java:16)
at Java.CustomClassLoader$1.run(CustomClassLoader.java:45)
at java.security.AccessController.doPrivileged(Native Method)
at Java.CustomClassLoader.findClass(CustomClassLoader.java:33)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
.....
我不知道这有什么错,因为我正在为类传递正确的类名和路径。这是我正在使用的代码

自定义类加载器

import java.io.FileInputStream;
import java.security.AccessControlContext;
import java.security.AccessController;
import java.security.PrivilegedExceptionAction;

public class CustomClassLoader extends ClassLoader {

String repoLocation = "C:/TempBINfolder/bin/JUnit/";

public CustomClassLoader() { }

public CustomClassLoader(ClassLoader parent) {
super(parent);
}

@Override
protected Class<?> findClass(final String name)
throws ClassNotFoundException {

AccessControlContext acc = AccessController.getContext();

try {
return (Class)AccessController.doPrivileged(
 new PrivilegedExceptionAction() {
  public Object run() throws ClassNotFoundException {

   FileInputStream fi = null;
   try {

    String path = name.replace('.', '/');
    fi = new FileInputStream(repoLocation + path
      + ".class");
    byte[] classBytes = new byte[fi.available()];
    fi.read(classBytes);
    return defineClass(name, classBytes, 0,
      classBytes.length);
   }catch(Exception e )
   {
    throw new ClassNotFoundException(name);
   }
  }
 }, acc);
} catch (java.security.PrivilegedActionException pae) {
return super.findClass(name);
}
}
}

有人知道我为什么会出现这个错误吗?

有时候这种情况会发生在我身上,通常通过清理和构建来解决。如果这不起作用,我通常会重新启动IDE。

您必须将SimpleTest类声明为在JUnit包中,但您尝试加载的只是SimpleTest(无包)。试试他:

  • 删除包声明
  • 从位置删除Junit:
    String repoLocation=“C:/TempBINfolder/bin/”

  • 类名应该是完全限定的
    junit.samples.SimpleTest

        stringClass = cls.loadClass("SimpleTest");
    
    应该是

        stringClass = cls.loadClass("junit.sample.SimpleTest");
    
    改变

    stringClass=cls.loadClass(“SimpleTest”)
    

    stringClass=cls.loadClass(“JUnit.SimpleTest”)

    (即添加类文件的完全限定包名)

    String repoLocation=“C:/TempBINfolder/bin/JUnit/”
    


    String repoLocation=“C:/TempBINfolder/bin/”

    您的类是在包JUnit中定义的吗?如果是的话,你能把它取下来试试吗?或者更改字符串repoLocation=“C:/TempBINfolder/bin/JUnit/”;到字符串repoLocation=“C:/TempBINfolder/bin/”;这确实消除了我所有的错误,但是当我现在运行它时,如果我在
    SimpleTest.java
    中放置一个断点,它就永远不会到达断点。。。由于没有错误,我不知道它是否正常工作,您有什么想法吗?如果在同一个eclipse项目中,它应该达到断点。如果project不同,请尝试将该项目添加到用于运行上述程序的运行/调试配置的“源”部分。为了理解这一点,为什么我必须将JUnit从该位置取出并将其放入loadClass()?因为类装入器需要完全限定的名称-如错误
    中所示(错误名称:JUnit/SimpleTest)
    我们需要给出,
    JUnit.SimpleTest
    。但是当我们给出它时,代码的这一部分`stringpath=name.replace('.','/');fi=新文件输入流(repoLocation+path+“.class”);`导致在文件夹JUnit中搜索类文件。因此,我们从repository中删除JUnit。
        stringClass = cls.loadClass("junit.sample.SimpleTest");