import org.objectweb.asm.ClassWriter; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; import com.esotericsoftware.reflectasm.MethodAccess; public class ReflectASMExample { public static void main(String[] args) throws Exception { ClassWriter cw = new ClassWriter(0); cw.visit(Opcodes.V1_6, Opcodes.ACC_PUBLIC, "GeneratedClass", null, "java/lang/Object", null); cw.visitField(Opcodes.ACC_PRIVATE, "name", "Ljava/lang/String;", null, null).visitEnd(); MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "greet", "()Ljava/lang/String;", null, null); mv.visitCode(); mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitFieldInsn(Opcodes.GETFIELD, "GeneratedClass", "name", "Ljava/lang/String;"); mv.visitInsn(Opcodes.ARETURN); mv.visitMaxs(1, 1); mv.visitEnd(); cw.visitEnd(); byte[] code = cw.toByteArray(); Class<?> generatedClass = new CustomClassLoader().defineClass("GeneratedClass", code); Object instance = generatedClass.getDeclaredConstructor().newInstance(); MethodAccess methodAccess = MethodAccess.get(generatedClass); methodAccess.invoke(instance, "setName", "John Doe"); String name = (String) methodAccess.invoke(instance, "greet"); System.out.println("Hello, " + name); } } class CustomClassLoader extends ClassLoader { public Class<?> defineClass(String name, byte[] code) { return defineClass(name, code, 0, code.length); } }


上一篇:
下一篇:
切换中文