【问题标题】:Creating a getter for a static field in Java using Objecweb ASM使用 Objecweb ASM 在 Java 中为静态字段创建 getter
【发布时间】:2015-05-12 08:54:40
【问题描述】:

好的,所以我正在尝试在 ClassA 中创建一个 getter,它使用 Objectweb ASM 在 ClassB 中返回一个静态字段。 我开始使用的类如下所示:

A 类:

public class ClassA {

}

B 类:

public class ClassB {

    static int secret = 123;

}

我正试图转储 ClassA,使其在反编译后看起来像这样:

public class ClassA {

    public int getSecretInt(){
        return ClassB.secret;
    }
}

到目前为止,我已经能够在 ClassA 本身中返回字段,但我不确定如何在其他类中返回静态字段。

我能做什么:(这向 ClassA 添加了一个方法,该方法在其自身内部返回一个变量)

        MethodNode mn = new MethodNode(ACC_PUBLIC, getterName, "()" + fieldDescriptor, signature, null);

        mn.instructions.add(new VarInsnNode(ALOAD, 0));
        mn.instructions.add(new FieldInsnNode(isStatic ? GETSTATIC : GETFIELD, cn.name, fieldName, fieldDescriptor));
        mn.instructions.add(new InsnNode(retInsn));

        mn.visitMaxs(3, 3);
        mn.visitEnd();
        cn.methods.add(mn);

我想做的是让我生成的这个方法从 ClassB 返回一个静态值。

基本上做到了:

return ClassB.secret;

【问题讨论】:

  • 只是想知道:您从事这项工作的目的是什么?只是学习/好奇;或者这是一些“真正的产品”?
  • 学习/好奇心,似乎这是一个非常方便学习和应用的库:)
  • 抱歉,我只是想澄清一下问题是什么?
  • @AlexShutin 我在上面详细阐述了我的问题
  • 我对 ASM 还没有热身,所以只是评论:ALOAD 0this,所以你应该有条件地使用 isStatic 来做这件事。您是否尝试过使用javap 查看所需的ClassA 的反汇编?

标签: java static return getter java-bytecode-asm


【解决方案1】:

一般来说,正确调用 ASM 的最简单方法是在从一些 Java 代码编译的字节码(.class 文件)上使用 ASMifier 类。

也就是说,从另一个类获取静态字段很简单,不需要使用 ASMifier。假设你有一个从 ClassWriter 获得的 MethodVisitor mw(如果你想直接生成字节码的话),它看起来像:

mw.visitFieldInsn(Opcodes.GETSTATIC, "ClassB", "secret", "I");
mw.visitInsn(Opcodes.IRETURN);

无需加载“this”(ALOAD 0)。此外,您不必自己计算帧和局部变量,您可以使用 ClassWriter.COMPUTE_FRAMES 和 COMPUTE_MAXS 以便 ASM 为您完成。而对于您显示的代码,您只有一个变量(“this”是隐式的)并且只需要一个堆栈元素(对于 ClassB.secret 的值)。

【讨论】:

    猜你喜欢
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多