Java asm中的静态初始值设定项

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

我想初始化使用asm添加到类中的静态字段。如果我可以访问静态初始值设定项,那么我就可以访问初始化


如何初始化静态字段?

您应该能够在

中覆盖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
    }
  }
}