我想初始化一个静态字段,它是我使用asm添加到一个类中的。如果我可以访问静态初始化器,那么我就可以访问初始化。
如何初始化静态字段?
发布于 2011-03-17 00:30:17
我假设您正在使用一个ClassAdapter添加字段,它将几乎所有内容都委托给一个ClassWriter,但也会调用visitField来添加新字段。
如果要添加的字段已初始化为常量。然后,您可以简单地直接向ClassVisitor.visitField提供对象文字。
如果要添加的字段需要复杂的静态初始化,则需要覆盖<clinit>方法的ClassAdapter.visitMethod检查,并创建添加所需代码的自定义MethodAdapter。代码的粗略草图如下:
class MyAdapter extends ClassAdapter {
public MyAdapter(ClassVisitor delegate) {
super(delegate);
}
@Override
public MethodVisitor visitMethod(int access, String name,
String desc, String signature, String[] exceptions) {
MethodVisitor r = super.visitMethod(access, name, desc, signature, exceptions);
if ("<clinit>".equals(name)) {
r = new MyMethodAdapter(r);
}
return r;
}
class MyMethodAdapter extends MethodAdapter {
MyMethodAdapter(MethodVisitor delegate) {
super(delegate);
}
@Override
public void visitCode() {
super.visitCode();
// build my static initializer by calling
// visitFieldInsn(int opcode, String owner, String name, String desc)
// or the like
}
}
}发布于 2010-11-10 02:20:10
您应该能够只覆盖ClassVisitor中的visitField
https://stackoverflow.com/questions/4135064
复制相似问题