2016-05-03 3 views
2

Wenn ich toBytecode() -Methode in meinem Zusammenhang nannte esJavassist: toBytecode() wirft Ausnahme java.lang.RuntimeException: remaper.by.moofMonkey.Main Klasse eingefroren, aber ihn nicht eingefroren ist

wirft java.lang.RuntimeException: remaper.by.moofMonkey.Main Klasse gefroren bei javassist.CtClassType.checkModify (CtClassType.java:515) bei javassist.CtClass.getClassFile (CtClass.java:524) bei com.moofMonkey. Main.writeFile (Main.java:340) bei com.moofMonkey.Main.saveClasses (Main.java:324) bei com.moofMonkey.Main.main (Main.java:309)

Mein Kontext:

..... 
for (CtClass cl : modClasses) { 
    cl.stopPruning(true); 
    writeFile(cl, "./ModifiedClasses"); //cl.writeFile("./ModifiedClasses"); 
    cl.stopPruning(false); 
} 
..... 
public static void writeFile(CtClass cl, String directoryName) throws Throwable { 
    System.out.println(">> " + cl.getName()); 

    byte[] bc = cl.toBytecode(); 

    String s = cl.getClassFile().getSourceFile(); 
    int index = new String(bc).indexOf(s); 
    for(int i = 0; i < s.length(); i++) //KILL SOURCEFILE (c) moofMonkey 
     bc[index + i] = '-'; 

    DataOutputStream out = cl.makeFileOutput(directoryName); 

    out.write(bc); 

    out.flush(); 
    out.close(); 
} 

aber ... aber. Wenn ich analog von writeFile() - cl.writeFile() aufrufe - alles funktioniert!

Ich kann dies tun:

1. Save File 
2. Read bytes from him 
3. Dp what I need 
4. Save File 
+0

Q Gelöst. Besonderer Dank für @SubOptimal – moofMonkey

Antwort

2

einen Blick in die javadoc von CtClass Mit enthüllt

Sobald diese Methode aufgerufen wird, weitere Modifikationen nicht mehr möglich sind.

Wenn Sie den Anruf, um

String s = cl.getClassFile().getSourceFile(); 
byte[] bc = cl.toBytecode(); 

ändern können Sie toBytecode nennen.

+0

Thx für Informationen: 3 – moofMonkey

+0

Nicht genug Dokumentation - bitte beachten Sie dies in der Zukunft: 3 Die meisten Menschen lieben Docs und lieben nicht Copy-Paste. Es tut uns leid. – moofMonkey

+0

@moofMonkey 'Die meisten Leute lieben Docs 'sind diejenigen, die eine solche Lösung selbst finden.;-) – SubOptimal

0

Die Ausnahme kommt nicht, wo Sie toBytecode nennen, aber in der nächsten Quellenleitung, wo Sie getClassFile nennen. Die documentation besagt, dass Sie nicht auf eine eingefrorene Klasse aufrufen dürfen.

Es gibt eine Methode namens getClassFile2, die sich um dieses Problem umgehen soll, scheint:

Gibt eine Klassendatei für diese Klasse (nur lesen). Normale Anwendungen müssen diese Methode nicht aufrufen. Verwenden Sie getClassFile().

Das mit dieser Methode abgerufene ClassFile-Objekt ist schreibgeschützt. Änderungen an diesem Objekt spiegeln sich möglicherweise nicht in einer Klassendatei wider, die von toBytecode(), toClass() usw. generiert wird.

Diese Methode ist auch dann verfügbar, wenn isFrozen() wahr ist. Wenn die Klasse jedoch eingefroren ist, wird sie möglicherweise ebenfalls bereinigt.

Der erste Absatz legt nahe, dass, wenn es irgendeine Art und Weise Ihren Code restrukturieren, damit es nicht eine Klassendatei für eine gefrorene Klasse erhalten muss, die durch die bessere (oder zumindest besser durchdachten der sein könnte Schöpfer von Javassist).

+0

Thx für Informationen: 3 – moofMonkey

Verwandte Themen