Java asm中的静态初始值设定项
我想初始化使用asm添加到类中的静态字段。如果我可以访问静态初始值设定项,那么我就可以访问初始化Java asm中的静态初始值设定项,java,bytecode,java-bytecode-asm,Java,Bytecode,Java Bytecode Asm,我想初始化使用asm添加到类中的静态字段。如果我可以访问静态初始值设定项,那么我就可以访问初始化 如何初始化静态字段?您应该能够在中覆盖visitField,您应该能够在中覆盖visitField。我假设您是通过使用将几乎所有内容委托给a并调用添加新字段来添加字段的 如果要添加的字段已初始化为常量。然后,您可以简单地将对象文本直接提供给 如果要添加的字段需要复杂的静态初始化,则需要覆盖该方法的检查,并创建添加所需代码的自定义项。代码的大致草图如下: class MyAdapter extends
如何初始化静态字段?您应该能够在中覆盖visitField,您应该能够在中覆盖visitField。我假设您是通过使用将几乎所有内容委托给a并调用添加新字段来添加字段的 如果要添加的字段已初始化为常量。然后,您可以简单地将对象文本直接提供给 如果要添加的字段需要复杂的静态初始化,则需要覆盖该方法的检查,并创建添加所需代码的自定义项。代码的大致草图如下:
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
}
}
}
我假设您是通过使用将几乎所有内容委托给的来添加字段的,但也会调用来添加新字段 如果要添加的字段已初始化为常量。然后,您可以简单地将对象文本直接提供给 如果要添加的字段需要复杂的静态初始化,则需要覆盖该方法的检查,并创建添加所需代码的自定义项。代码的大致草图如下:
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
}
}
}