首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >asm中的静态初始化器

问asm中的静态初始化器
EN

Stack Overflow用户
提问于 2010-11-09 22:56:10
回答 2查看 1.4K关注 0票数 1

我想初始化一个静态字段,它是我使用asm添加到一个类中的。如果我可以访问静态初始化器,那么我就可以访问初始化。

如何初始化静态字段?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-17 00:30:17

我假设您正在使用一个ClassAdapter添加字段,它将几乎所有内容都委托给一个ClassWriter,但也会调用visitField来添加新字段。

如果要添加的字段已初始化为常量。然后,您可以简单地直接向ClassVisitor.visitField提供对象文字。

如果要添加的字段需要复杂的静态初始化,则需要覆盖<clinit>方法的ClassAdapter.visitMethod检查,并创建添加所需代码的自定义MethodAdapter。代码的粗略草图如下:

代码语言:javascript
复制
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
    }
  }
}
票数 4
EN

Stack Overflow用户

发布于 2010-11-10 02:20:10

您应该能够只覆盖ClassVisitor中的visitField

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4135064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档