代码之家  ›  专栏  ›  技术社区  ›  Sarmun

在运行时创建带注释字段的Java类

  •  1
  • Sarmun  · 技术社区  · 16 年前

    问题是我需要在运行时创建这样的类:

    public class Foo {
      @Bar int value0;
      @Bar int value1;
      @Bar int value2;
    ....
    }
    

    在运行时确定字段数。

    我在看Javassist,您可以在那里创建一个新类,并向其中添加字段,但我还没有找到一种方法来注释这些字段。

    1 回复  |  直到 16 年前
        1
  •  5
  •   Brett Kail    16 年前

    您可以使用字节码操作库,比如 ASM :

    import java.lang.reflect.Field;
    import java.util.Arrays;
    import org.objectweb.asm.ClassWriter;
    import org.objectweb.asm.FieldVisitor;
    import org.objectweb.asm.Opcodes;
    public class a {
      public static void main(String[] args) throws Exception {
        Class<?> klass = new ClassLoader(a.class.getClassLoader()) {
          public Class<?> defineClass() {
            ClassWriter cw = new ClassWriter(0);
            cw.visit(Opcodes.V1_6, Opcodes.ACC_PUBLIC + Opcodes.ACC_SUPER,
              "Foo", null, "java/lang/Object", null);
            for (int i = 0; i < 3; i++) {
              FieldVisitor fv = cw.visitField(0, "value" + i, "I", null, null);
              fv.visitAnnotation("LBar;", true).visitEnd();
            }
            cw.visitEnd();
            byte[] bytes = cw.toByteArray();
            return defineClass("Foo", bytes, 0, bytes.length);
          }
        }.defineClass();
    
        for (Field f : klass.getDeclaredFields()) {
          System.out.println(f + " " + Arrays.toString(f.getAnnotations()));
        }
      }
    }
    

    输出:

    int Foo.value0 [@Bar()]
    int Foo.value1 [@Bar()]
    int Foo.value2 [@Bar()]
    
    推荐文章