2015-09-06 78 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

相关问题