当变量明显存在时,Javassist没有这样的字段

当变量明显存在时,Javassist没有这样的字段,java,code-injection,javassist,Java,Code Injection,Javassist,我正试图使用javassist将代码注入minecraft 1.8JAR。insertBefore和insertAfter方法工作得非常好。但是insert at方法没有按预期工作。我得到这个错误: 以下是处理注入的代码: if (className.equals(mappingManager.getMapping(CommonMappings.MINECRAFT_CLASS))) { CtClass ctClass = classPool.get(mappingManager.ge

我正试图使用javassist将代码注入minecraft 1.8JAR。
insertBefore
insertAfter
方法工作得非常好。但是insert at方法没有按预期工作。我得到这个错误:

以下是处理注入的代码:

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;
} 
我已经对获取映射的行进行了注释,本质上这些是minecraft模糊化的变量和函数名,因为这是我将要插入的内容

好的,那么合乎逻辑的解释是
var1
不存在?那不是真的。如果我们查看模糊化的
bsu
类的代码,我们可以看到:

好吧,我想出来了。事实证明javassist不知道是否定义了局部变量,它假设
var1
是一个字段。我通过创建自己的变量并将其设置为与
var1
相同的值来解决这个问题


来源:

如果IntelliJ color
var1是一个属性,它不应该是紫色的吗?它看起来像一个局部变量me@Dici它是上面几行定义的局部变量?不要看颜色,intellij在反编译时颜色不对。这是该类的反编译版本。编辑:刚刚意识到我把问题命名为“字段”,让我改变它不,不要改变它。错误消息提到一个字段。。。如果它是一个局部变量,那么您可能在其他地方将其用作字段,这就解释了bug@Dici嗯,看来javasist认为
var1
变量是一个字段,而不是loca变量。我不太理解你的代码,但我认为你在一个超出范围的地方使用
var1
,那么它只能被视为一个字段,而这个字段并不存在,因此这个错误听起来像是黑客攻击。通常,更好的做法是理解为什么会发生某些事情,而不是找到一个奇怪的解决办法并采取行动forward@Dici我想说更多的是javassist的局限性?我检查了API,没有找到获取变量的方法。如果有人有更好的解决方案,那么他们可以继续。@Dici Yeah原来我的假设是对的,嗯,是的,似乎是这样。干得好:)+1