2015-09-06 22 views
2

我想注入代碼到Minecraft 1.8 jar使用javassist。 insertBefore & insertAfter方法工作得很好。但方法插入不能按預期工作。我收到此錯誤: https://gist.github.com/czaarek99/dda36426318f331ce6b0Javassist沒有這樣的領域,當變量明確存在

這裏是處理注入代碼:

if (className.equals(mappingManager.getMapping(CommonMappings.MINECRAFT_CLASS))) { 

    CtClass ctClass = classPool.get(mappingManager.getMapping(CommonMappings.MINECRAFT_CLASS, true)); //returns "bsu" 

    CtMethod tickMethod = ctClass.getDeclaredMethod(mappingManager.getMapping(CommonMappings.RUN_TICK_METHOD)); //returns "r" 
    tickMethod.insertBefore("EventManager.call(new TickEvent(TickEvent.PRE_UPDATE));"); 
    tickMethod.insertAfter("EventManager.call(new TickEvent(TickEvent.POST_UPDATE));"); 

    String varName = mappingManager.getMapping(CommonMappings.KEYBOARD_KEYCODE_VARIABLE); //returns "var1" 

    int lineToInsertAt = Integer.valueOf(mappingManager.getMapping(CommonMappings.KEYBOARD_NEXT_LINE)); //returns "1372" 
    tickMethod.insertAt(lineToInsertAt, true, "KeyPressEvent keyPressEvent = new KeyPressEvent("+ varName +");EventManager.call(keyPressEvent);");; 

    CtMethod runGameMethod = ctClass.getDeclaredMethod(mappingManager.getMapping(CommonMappings.START_GAME_METHOD)); //returns "aj" 
    runGameMethod.insertAfter("InjectClient.getInstance().loadModules();"); 

    byte[] newCode = ctClass.toBytecode(); //line that throws the error 
    ctClass.detach(); 

    return newCode; 
} 

我已作了評論它抓住一個映射線,基本上這些都是我的世界,因爲這混淆變量&函數名是我將插入到。

好吧,所以邏輯的解釋是var1不存在?這不是真的。如果我們看看混淆的bsu類的代碼,我們可以看到: enter image description here

+0

不應該的IntelliJ色'var1'紫色,如果它是一個屬性?它看起來像一個局部變量 – Dici

+0

@Dici它是一個局部變量定義了幾行以上?不要看顏色,intellij在反編譯時不會着色。這是該課程的反編譯版本。編輯:剛纔意識到我命名的問題「領域」讓我改變, – czaarek99

+0

不,不要改變這一點。錯誤消息提到了一個字段...如果它是一個局部變量,那麼你可能會將它用作其他字段,這就解釋了你的bug – Dici

回答

2

好吧我想通了。原來javassist不知道是否定義了一個局部變量,並假定var1是一個字段。我通過創建自己的變量並將其設置爲與var1相同的值來解決此問題。

來源:http://jboss-javassist.github.io/javassist/tutorial/tutorial2.html

+0

聽起來像一個黑客。通常最好是理解爲什麼發生了什麼,而不是找到一個奇怪的解決方法,並向前移動 – Dici

+0

@Dici我會說它更多的javassist的限制?我檢查了一下API,並找不到獲取變量的方法。如果有人有更好的解決方案,那麼他們可以繼續。 – czaarek99

+1

@Dici是啊我的假設是正確的[來源](http://www.ibm.com/developerworks/library/j-dyn0916/) – czaarek99

相關問題