0

私は次のリンクから例をたどっていました:

http://www.javaworld.com/javaworld/jw-10-1996/jw-10-indepth.html?page=1 そしてこれは私が得ている出力です:

このプログラムはSimpleClassLoaderを使用します。
        >>>>>>ロードクラス:TestClass
        >>>>>>システムクラスではありません。
        >>>>>>TestClassの実装を取得する
ファイルが正常に読み取られました
スレッド"main"の例外java.lang.ClassFormatError:クラスファイルの互換性のないマジック値1768779887
    java.lang.ClassLoader.defineClass1(ネイティブメソッド)で
    java.lang.ClassLoader.defineClassCond(不明なソース)で
    java.lang.ClassLoader.defineClass(不明なソース)で
    java.lang.ClassLoader.defineClass(不明なソース)で
    aha.SimpleClassLoader.loadClass(SimpleClassLoader.java:80)で
    aha.SimpleClassLoader.loadClass(SimpleClassLoader.java:42)で
    aha.Example.main(Example.java:11)​​で

これは、ファイルを読み取る私のメソッドの例です。

 private byte getClassImplFromDataBase(String className)[] {
        System.out.println("        >>>>>> Fetching the implementation of "+className);
        byte result[];
        try {
            FileInputStream fi = new FileInputStream("C:/delete/"+className+".impl");
            result = new byte[fi.available()];
            fi.read(result);
            System.out.println("file was read succesfullyl");
            return result;
        } catch (Exception e) {

            /*
             * If we caught an exception, either the class wasnt found or it
             * was unreadable by our process.
             */
            return null;
        }
    }

TestClass.implファイルをC:/deleteディレクトリに配置しました。私のクラスはパッケージの下にあります:ahaしたがって、ファイルTestClass.implは正常に読み取られますが、結果の間に何かが発生します= defineClass(classData、0、classData.length); このメソッドが非推奨になっていることは知っていますが、それでも??

4

2 に答える 2

5

ファイルの種類はわかりませんが.impl、バイト コードを含むクラス ファイルではないと思われます。176877988716 進数のマジック ナンバーは696D706F、またはimpoASCII です。import(私の疑いの最初の 4 バイト)

したがって、コンパイルされていないJavaコードをロードしようとしているように見えますが、それはできません(それがコンパイラの目的です)。コンパイラAPIを使用する方が良いですが、ロードしようとしてOSGiのようなものが本当に必要だと思います自分でクラスを作成するには、クラスのロードがどのように機能するかについて非常に詳細に理解している必要があります。

于 2011-06-13T08:15:10.833 に答える