【发布时间】: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 0是this,所以你应该有条件地使用isStatic来做这件事。您是否尝试过使用javap查看所需的ClassA的反汇编?
标签: java static return getter java-bytecode-asm