2016-10-06 10 views
0

私は、次のコードを使用して、ファイルにASMを使用して作成byte配列書きました:ASMで作成したクラスファイルを読み込む際に、マジックバリューエラーが発生するのはなぜですか?

try(FileOutputStream stream = new FileOutputStream(classname + ".class")) { 
     stream.write(res); 
    } 
    catch (IOException e) { 
     e.printStackTrace(); 
    } 

ファイルは、次のコードを使用してロードされます。

@Override 
public Class<?> findClass(String name) { 
    for(URL url : getURLs()) { 
     File file = new File(url.getPath().substring(1) + name + ".class"); 
     if(file.exists()) { 
      try { 
       System.out.println("found class"); 
       byte[] bytes = IOUtils.toByteArray(new FileReader(file)); 
       return super.defineClass(name, bytes, 0, bytes.length);    
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
    return null; 
} 

クラスは私のClassLoaderによって発見されたのが、私はClassFormatErrorを取得します。魔法の値は4022320623です。

この現象の原因は何ですか?

+1

あなたの 'res'データはおそらく適切にフォーマットされた' .class'ファイルではありません。 'res'をどうやって決めましたか? 「ASMで作成された」とはどういう意味ですか? – cxw

+0

http://stackoverflow.com/search?q=4022320623 – Holger

+0

ASMはJavaバイトコードを作成するためのフレームワークです – user2035039

答えて

0

問題は、ファイルが読み取られる方法(ApacheのCommons IOライブラリを使用している)のようです。

byte[] bytes = Files.readAllBytes(file.toPath()); 
+1

問題はApacheライブラリの 'toByteArray'ではなく、' FileReader'を渡すことですこれは適切な 'FileInputStream'ではなく、テキストの読み込み用に設計されています。 'Reader'を受け入れるメソッドの存在が間違っていると言うことができますが、これはメソッドが非難された理由の1つかもしれません(https://commons.apache.org/proper/commons-io/ javadocs/api-2.5/org/apache/commons/io/IOUtils.html#toByteArray(java.io.Reader))。もちろん、Java 7以降を使用している場合は、サードパーティのライブラリを使わずに 'Files.readAllBytes'を使用することができます。 – Holger

+0

あなたがそれにいる場合は、['Files.write'](https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#write-java)を使用することもできます。 .nio.file.Path-byte:A - java.nio.file.OpenOption ...-)バイト配列を格納します。 – Holger

関連する問題