首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CustomerClassLoader: NoClassDefFoundError

CustomerClassLoader: NoClassDefFoundError
EN

Stack Overflow用户
提问于 2012-08-16 00:31:01
回答 4查看 906关注 0票数 0

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

代码语言:javascript
复制
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)
.....

我不知道这有什么错,因为我传入了正确的类名和类的路径。下面是我使用的代码

CustomClassLoader

代码语言:javascript
复制
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);
}
}
}

这就是我所说的

代码语言:javascript
复制
ClassLoader cls= new CustomClassLoader(ClassLoader.getSystemClassLoader());
Class stringClass = null;
    try {
        stringClass = cls.loadClass("SimpleTest");
    } catch (ClassNotFoundException ex) {
        Logger.getLogger(CompilerForm.class.getName()).log(Level.SEVERE, null, ex);
    }
    try {
        stringClass.newInstance();
    } catch (InstantiationException ex) {
        Logger.getLogger(CompilerForm.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        Logger.getLogger(CompilerForm.class.getName()).log(Level.SEVERE, null, ex);
    }

    JUnitCore.runClasses(stringClass);

有人知道我为什么会收到这个错误吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-08-16 02:04:35

变化

stringClass = cls.loadClass("SimpleTest");

stringClass = cls.loadClass("JUnit.SimpleTest");

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

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

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

票数 1
EN

Stack Overflow用户

发布于 2012-08-16 00:42:28

您必须声明您的SimpleTest类在JUnit包中,但您试图加载的是简单的SimpleTest (没有包)。试试eiteher:

从以下位置删除软件包declaration

  • remove Junit:String repoLocation = "C:/TempBINfolder/bin/";

中的

票数 0
EN

Stack Overflow用户

发布于 2012-08-16 01:06:55

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

代码语言:javascript
复制
    stringClass = cls.loadClass("SimpleTest");

应该是

代码语言:javascript
复制
    stringClass = cls.loadClass("junit.sample.SimpleTest");
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11973231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档