gpt4 book ai didi

java - 通过字节码访问变量

转载 作者:行者123 更新时间:2023-12-01 12:37:31 25 4
gpt4 key购买 nike

我需要访问字节码中的变量。我已经弄清楚如何使用局部变量(使用 ILOAD)来做到这一点,但我似乎无法让它使用我正在使用的方法之外的值。是否有一个操作码可以加载变量内部的变量一个类但在方法之外?

当变量位于方法内部时,这有效:

  if (currentNode.getOpcode() == RETURN)
{
InsnList toInject = new InsnList();
toInject.add(new TypeInsnNode(NEW, "timeTraveler/mechanics/LivingPlaceBlockEvent"));
toInject.add(new InsnNode(DUP));
toInject.add(new VarInsnNode(ALOAD, 5));
toInject.add(new VarInsnNode(ALOAD, 6));
toInject.add(new VarInsnNode(ILOAD, 2));
toInject.add(new VarInsnNode(ILOAD, 3));
toInject.add(new VarInsnNode(ILOAD, 4));
toInject.add(new MethodInsnNode(INVOKESPECIAL, "timeTraveler/mechanics/LivingPlaceBlockEvent", "<init>", "(Lnet/minecraft/entity/EntityLivingBase;Lnet/minecraft/item/ItemStack;III)V"));
toInject.add(new VarInsnNode(ASTORE, 7));
toInject.add(new FieldInsnNode(GETSTATIC, "net/minecraftforge/common/MinecraftForge", "EVENT_BUS", "Lnet/minecraftforge/event/EventBus;"));
toInject.add(new VarInsnNode(ALOAD, 7));
toInject.add(new MethodInsnNode(INVOKEVIRTUAL, "net/minecraftforge/event/EventBus", "post", "(Lnet/minecraftforge/event/Event;)Z"));
toInject.add(new InsnNode(POP));
m.instructions.insertBefore(currentNode, toInject);
}

最佳答案

在类中定义的变量称为字段。要访问它们,您可以使用 getfieldgetstatic 指令,具体取决于字段是否静态。

公共(public)静态字段是 Java 最接近全局变量的类型。

关于java - 通过字节码访问变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25457423/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com