Java动态生成实体类是指通过Java代码动态生成实体类,而不是通过编译器来生成。的代码可以用来动态生成一个实体类:
Java动态生成实体类是指通过Java代码动态生成实体类,而不是通过编译器来生成。
的代码可以用来动态生成一个实体类:
// 定义实体类名称
String className = "Person";
// 定义属性
String[] fields = {"name", "age", ""};
// 创建一个新的ClassWriter
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
// 声明一个类,使用JDK 1.8版本,public,继承自java.lang.Object,并指定其全限定名
cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, className, null, "java/lang/Object", null);
// 循环生成属性
for (String field : fields) {
// 生成属性
FieldVisitor fv = cw.visitField(Opcodes.ACC_PRIVATE, field, "Ljava/lang/String;", null, null);
fv.visitEnd();
// 生成getter方法
MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "get" + field.substring(0, 1).toUpperCase() + field.substring(1), "()Ljava/lang/String;", null, null);
mv.visitCode();
mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitFieldInsn(Opcodes.GETFIELD, className, field, "Ljava/lang/String;");
mv.visitInsn(Opcodes.ARETURN);
mv.visitMaxs(1, 1);
mv.visitEnd();
// 生成setter方法
mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "set" + field.substring(0, 1).toUpperCase() + field.substring(1), "(Ljava/lang/String;)V", null, null);
mv.visitCode();
mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitVarInsn(Opcodes.ALOAD, 1);
mv.visitFieldInsn(Opcodes.PUTFIELD, className, field, "Ljava/lang/String;");
mv.visitInsn(Opcodes.RETURN);
mv.visitMaxs(2, 2);
mv.visitEnd();
}
// 生成无参构造函数
MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "
mv.visitCode();
mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "
mv.visitInsn(Opcodes.RETURN);
mv.visitMaxs(1, 1);
mv.visitEnd();
// 生成类
cw.visitEnd();
// 获取字节数组
byte[] code = cw.toByteArray();
// 使用自定义的类
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(10条)