Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用ObjeCWebASM为Java中的静态字段创建getter_Java_Static_Return_Getter_Java Bytecode Asm - Fatal编程技术网

使用ObjeCWebASM为Java中的静态字段创建getter

使用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

好的,我尝试在ClassA中创建一个getter,它使用ObjectWebASM在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添加了一个方法,该方法在其自身内部返回一个变量)

我想做的是让这个方法从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);