2016-10-06 1 views
0

j'ai écrit un tableau byte créé avec ASM à un fichier en utilisant le code suivant:Pourquoi une erreur de valeur magique se produit-elle lors du chargement d'un fichier de classe créé avec ASM?

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

Le fichier est chargé en utilisant le code suivant:

@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; 
} 

La classe se trouve mon ClassLoader, mais Je reçois un ClassFormatError la valeur magique est 4022320623.

Quelle est la cause de ce comportement?

+1

Vos données 'res' n'est probablement pas un fichier' .class' correctement formaté. Comment avez-vous déterminé 'res'? Que signifie "créé avec ASM"? – cxw

+0

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

+0

ASM est un framework pour créer du code java byte – user2035039

Répondre

0

Le problème semble être la façon dont le fichier est lu (en utilisant la bibliothèque IO Commons d'Apache). Utilisation de ce qui suit pour lire le fichier fonctionne très bien:

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

Le problème n'est pas le 'toByteArray' de la bibliothèque Apache, mais le fait que vous passez un' FileReader' à il, qui est conçu pour la lecture de texte, plutôt que le 'FileInputStream' approprié. Vous pouvez dire que l'existence d'une méthode acceptant un 'Reader' est trompeuse, mais cela pourrait être l'une des raisons pour lesquelles la méthode [a été abandonnée] (https://commons.apache.org/proper/commons-io/ javadocs/api-2.5/org/apache/commons/io/IOUtils.html # àByteArray (java.io.Reader)). Bien sûr, si vous utilisez Java 7 ou plus récent, vous pouvez simplement utiliser 'Files.readAllBytes' sans bibliothèque tierce. – Holger

+0

Si vous y êtes, vous pouvez également utiliser ['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 ...-) pour stocker le tableau d'octets. – Holger