إنشاء فئة Java مع حقول مشروحة في وقت التشغيل
-
04-10-2019 - |
سؤال
المشكلة هي أنني بحاجة إلى إنشاء فئة مثل هذا:
public class Foo {
@Bar int value0;
@Bar int value1;
@Bar int value2;
....
}
مع وجود عدد من الحقول التي يتم تحديدها في وقت التشغيل.
كنت أنظر إلى Javassist ، ويمكنك إنشاء فصل جديد ، وإضافة حقول إليه ، لكنني لم أجد طريقة للتعليق على هذه الحقول.
المحلول
يمكنك استخدام مكتبة معالجة Bytecode مثل 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()]
لا تنتمي إلى StackOverflow