Frage

Das Problem ist, dass ich in der Laufzeit eine solche Klasse erstellen muss:

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

mit der Anzahl der Felder zur Laufzeit entschieden.

Ich habe Javassist angesehen, und dort können Sie eine neue Klasse erstellen und Felder hinzufügen, aber ich habe keinen Weg gefunden, diese Felder zu kommentieren.

War es hilfreich?

Lösung

Sie können eine Bytecode -Manipulationsbibliothek wie verwenden 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()));
    }
  }
}

Ausgabe:

int Foo.value0 [@Bar()]
int Foo.value1 [@Bar()]
int Foo.value2 [@Bar()]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top