/** * Generate a new class for the given {@link PersistentEntity}. * * @param internalClassName * @param entity * @param constructor * @return */ public byte[] generateBytecode(String internalClassName, PersistentEntity<?, ?> entity, @Nullable PreferredConstructor<?, ?> constructor) { ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS); cw.visit(Opcodes.V1_6, ACC_PUBLIC + ACC_SUPER, internalClassName.replace('.', '/'), null, JAVA_LANG_OBJECT, IMPLEMENTED_INTERFACES); visitDefaultConstructor(cw); visitCreateMethod(cw, entity, constructor); cw.visitEnd(); return cw.toByteArray(); }
@Override protected byte[] transform(byte[] b) throws Exception { ClassWriter writer = new ClassWriter(false); // TODO: create util for going from class -> type descriptor ClassAdapter adapter = new AddAnnotationAdapter(writer, "Lorg/aspectj/lang/annotation/Aspect;"); ClassReader reader = new ClassReader(b); reader.accept(adapter, false); return writer.toByteArray(); } });
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
/** * 创建一个类 * @param classGenerator * @return */ public static Class<?> generatorClass(ClassGeneratorEntity classGenerator) throws IOException { ClassWriter cw; if (classGenerator.getVisitClass() != null) { throw new RuntimeException("method not implement"); /*try { Class.forName(classGenerator.getVisitClass().getName()); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } ClassReader classReader = new ClassReader(classGenerator.getVisitClass().getName()); cw = new ClassWriter(classReader, ClassWriter.COMPUTE_MAXS);*/ } else { cw = new ClassWriter(ClassWriter.COMPUTE_MAXS); visitDefaultConstructor(cw); } cw.visit(Opcodes.V1_6, ACC_PUBLIC + ACC_SUPER, classGenerator.getGeneratorName(), null, JAVA_LANG_OBJECT, null); visitAddFiled(cw,classGenerator); visitGetMethod(cw,classGenerator); visitSetMethod(cw, classGenerator); cw.visitEnd(); return classLoader.defineClass(classGenerator.getName(), cw.toByteArray()); }
/** * Generate a new class for the given {@link PersistentEntity}. */ static byte[] generateBytecode(String internalClassName, PersistentEntity<?, ?> entity) { ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS); cw.visit(Opcodes.V1_6, ACC_PUBLIC + ACC_SUPER, internalClassName, null, JAVA_LANG_OBJECT, IMPLEMENTED_INTERFACES); List<PersistentProperty<?>> persistentProperties = getPersistentProperties(entity); visitFields(entity, persistentProperties, cw); visitDefaultConstructor(entity, internalClassName, cw); visitStaticInitializer(entity, persistentProperties, internalClassName, cw); visitBeanGetter(entity, internalClassName, cw); visitSetProperty(entity, persistentProperties, internalClassName, cw); visitGetProperty(entity, persistentProperties, internalClassName, cw); cw.visitEnd(); return cw.toByteArray(); }
byte[] generateClassBytecode(String className, Class<? extends DataSerializable> clazz, int classId) { ClassWriter cw = new ClassWriter(0);
byte[] generateClassBytecode(String className, Class<? extends DataSerializable> clazz, int classId) { ClassWriter cw = new ClassWriter(0);