我想初始化一个静态字段,我使用asm添加到一个类中。如果我可以访问静态初始化程序,那么我可以进行初始化。
如何初始化静态字段?
答案 0 :(得分:3)
我假设您使用ClassAdapter添加该字段,该ClassWriter几乎将所有内容委托给visitField,但也会调用ClassVisitor.visitField来添加新字段。
如果要添加的字段初始化为常量。然后,您只需将对象文字直接提供给ClassAdapter.visitMethod。
如果要添加的字段需要复杂的静态初始化,则需要覆盖MethodAdapter检查<clinit>
方法并创建添加所需代码的自定义{{3}}。代码的草图如下:
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
}
}
}
答案 1 :(得分:0)
您应该可以在ClassVisitor
中覆盖visitField