如果你真的想要做这样的事情,你可以通过使用ASM或其他一些库的字节码生成。
以下代码将生成一个名为“foo.bar.ClassWithFields”的类,其中包含字段“var0”到“var99”。当然,除了反射之外,没有办法访问这些字段,因为它们在编译时不存在,Java是一种静态类型的语言。
import org.objectweb.asm.*;
import static org.objectweb.asm.Opcodes.*;
import java.lang.reflect.Field;
public class GeneratedFieldsExperiment {
public static byte[] generateClassWithFields(int fieldCount) throws Exception {
ClassWriter cw = new ClassWriter(0);
FieldVisitor fv;
MethodVisitor mv;
AnnotationVisitor av0;
cw.visit(V1_6, ACC_PUBLIC + ACC_SUPER, "foo/bar/ClassWithFields", null, "java/lang/Object", null);
for (int i = 0; i < fieldCount; i++) {
fv = cw.visitField(ACC_PUBLIC, "var" + i, "Ljava/lang/String;", null, null);
fv.visitEnd();
}