当我试图将.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)
.....我不知道这有什么错,因为我传入了正确的类名和类的路径。下面是我使用的代码
CustomClassLoader
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);
}
}
}这就是我所说的
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);有人知道我为什么会收到这个错误吗?
发布于 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/";
发布于 2012-08-16 00:42:28
您必须声明您的SimpleTest类在JUnit包中,但您试图加载的是简单的SimpleTest (没有包)。试试eiteher:
从以下位置删除软件包declaration
String repoLocation = "C:/TempBINfolder/bin/";中的
发布于 2012-08-16 01:06:55
类名应该是完全限定的junit.samples.SimpleTest
stringClass = cls.loadClass("SimpleTest");应该是
stringClass = cls.loadClass("junit.sample.SimpleTest");https://stackoverflow.com/questions/11973231
复制相似问题