【问题标题】:Creating java class with annotated fields in runtime在运行时创建带有注释字段的java类
【发布时间】:2010-05-21 22:26:24
【问题描述】:

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

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

在运行时决定字段数。

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

【问题讨论】:

  • 我很想知道你为什么不能使用数组。
  • 我正在使用需要它的库。库旨在用于固定对象,但我需要在运行时更灵活地生成它们。

标签: java code-generation annotations field javassist


【解决方案1】:

你可以使用像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()]

【讨论】:

    猜你喜欢
    • 2013-05-04
    • 2019-09-16
    • 1970-01-01
    • 2016-07-19
    • 2016-02-22
    • 1970-01-01
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多