2016-05-03 33 views
2

如果我打電話toBytecode()方法在我的情況下,它拋出了Javassist:toBytecode()拋出異常了java.lang.RuntimeException:remaper.by.moofMonkey.Main類被凍結,但他不結冰

java.lang.RuntimeException:remaper.by.moofMonkey.Main類被凍結在javassist.CtClassType.checkModify(CtClassType.java:515) 處於javassist.CtClass.getClassFile(CtClass.java:524) com.moofMonkey處。 Main.writeFile(Main.java:340) at com.moofMonkey.Main.saveClasses(Main.java:324) at com.moofMonkey.Main.main(Main.java:309)

我的背景:

..... 
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(); 
} 

可是......可是。如果我調用writeFile()的模擬 - cl.writeFile() - 所有的作品!

我可以這樣做:

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

Q已解決。特別感謝@SubOptimal – moofMonkey

回答

2

在看看到的CtClass的Javadoc揭示

一旦這個方法被調用,進一步的修改是不可能的了。

如果你改變呼叫爲了

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

你可以調用toBytecode

+0

Thx的信息:3 – moofMonkey

+0

沒有足夠的文件 - 請注意這在未來:3 大多數人喜歡文檔,不喜歡複製粘貼。抱歉。 – moofMonkey

+0

@moofMonkey「大多數人喜歡docs'這些都是自己找到解決方案的人。;-) – SubOptimal

0

異常不來了,你叫toBytecode但在接下來的源代碼行,你叫getClassFiledocumentation表示您不允許在凍結的課程中調用此函數。

有一個叫getClassFile2方法,似乎意在解決此問題:

返回這個類的類文件(只讀)。普通應用程序不需要調用此方法。使用getClassFile()。

通過此方法獲取的ClassFile對象是隻讀的。此對象的更改可能不會反映在由toBytecode(),toClass()等生成的類文件中。

即使isFrozen()爲true,此方法也可用。但是,如果課程被凍結,它可能也會被修剪。

第一段表明,如果有一些方法來調整你的代碼,所以它並不需要獲得一個冷凍類的類文件,這可能是更好的(或者至少更深思熟慮的由Javassist的創造者)。

+0

Thx的信息:3 – moofMonkey

相關問題