0

.classファイルをロードしようとしているときにCustomerClassLoaderで遊んでいますJUnitCore.runClasses(...);が、次のエラーが発生します

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);

なぜ私がこのエラーを受け取るのか誰かが知っていますか?

4

4 に答える 4

1

変化する

stringClass = cls.loadClass("SimpleTest");

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

(つまり、クラス ファイルの完全修飾パッケージ名を追加します)

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

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

于 2012-08-15T18:04:35.390 に答える
0

クラス名は完全修飾する必要がありますjunit.samples.SimpleTest

    stringClass = cls.loadClass("SimpleTest");

する必要があります

    stringClass = cls.loadClass("junit.sample.SimpleTest");
于 2012-08-15T17:06:55.277 に答える
0

You must be declaring your SimpleTest class to be in JUnit package, but you are trying to load is as simply SimpleTest (no package). Try eiteher:

  1. remove the package declaration
  2. remove Junit from location: String repoLocation = "C:/TempBINfolder/bin/";
于 2012-08-15T16:42:27.587 に答える
-1

時々これは私に起こります、そして通常それはクリーンとビルドによって解決されます。それでも問題が解決しない場合は、通常、IDEを再起動します。

于 2012-08-15T16:40:34.920 に答える