使用ObjeCWebASM为Java中的静态字段创建getter
好的,我尝试在ClassA中创建一个getter,它使用ObjectWebASM在ClassB中返回一个静态字段。 我开始学习的课程如下所示: A类:使用ObjeCWebASM为Java中的静态字段创建getter,java,static,return,getter,java-bytecode-asm,Java,Static,Return,Getter,Java Bytecode Asm,好的,我尝试在ClassA中创建一个getter,它使用ObjectWebASM在ClassB中返回一个静态字段。 我开始学习的课程如下所示: A类: public class ClassA { } B类: public class ClassB { static int secret = 123; } 我试图将ClassA转储为反编译后的样子: public class ClassA { public int getSecretInt(){ retu
public class ClassA {
}
B类:
public class ClassB {
static int secret = 123;
}
我试图将ClassA转储为反编译后的样子:
public class ClassA {
public int getSecretInt(){
return ClassB.secret;
}
}
到目前为止,我已经能够在ClassA本身中返回字段,但我不知道如何在其他类中返回静态字段
我能做的:(这为ClassA添加了一个方法,该方法在其自身内部返回一个变量)
我想做的是让这个方法从ClassB生成并返回一个静态值
基本上做到了:
return ClassB.secret;
通常,获得对ASM的正确调用的最简单方法是在字节码(.class文件)上使用asmiger类,该字节码是从一些Java代码编译而来的 这就是说,从另一个类获取静态字段非常简单,不需要使用asmizer。假设您有一个从类编写器获得的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的值)。只是想知道:您的任务的目的是什么?只是学习/好奇心;或者这是为了一些“真正的产品”?学习/好奇,似乎这是一个非常方便的学习和应用库:)对不起,我只是想澄清问题是什么?@AlexShutin我在上面更详细地阐述了我的问题我对ASM不感兴趣,所以只需一句评论:
ALOAD 0
是this
,因此,您应该有条件地使用isStatic
执行此操作。您是否尝试过使用javap
查看所需的ClassA
反汇编?
mw.visitFieldInsn(Opcodes.GETSTATIC, "ClassB", "secret", "I");
mw.visitInsn(Opcodes.IRETURN);