给网站网站做代理,app界面设计模板免费下载,开发公司名称起名大全,手机网站建设cz35ASM是一个非常高效的Java字节码操控和分析框架#xff0c;它允许开发者在运行时或者编译时期动态地生成、改变或者分析类。ASM提供的功能强大且灵活#xff0c;适用于诸如框架开发、代码优化、代码生成等多种场景
需求#xff1a;用 asm 编写一个类并运行输出hello word
依…ASM是一个非常高效的Java字节码操控和分析框架它允许开发者在运行时或者编译时期动态地生成、改变或者分析类。ASM提供的功能强大且灵活适用于诸如框架开发、代码优化、代码生成等多种场景
需求用 asm 编写一个类并运行输出hello word
依赖 dependency groupIdorg.ow2.asm/groupId artifactIdasm/artifactId version9.1/version /dependency public static void main(String[] args) throws Exception {// 类名包括包名这里简化处理不指定包名String className com.asm.test.ExampleClass;String fullName className.replace(., /); // 将点换成斜杠因为ASM内部使用的是内部类名表示法// 创建ClassWriter对象用于生成字节码ClassWriter cw new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);// 定义类public class ExampleClasscw.visit(Opcodes.V1_8, // Java版本号这里是Java 8Opcodes.ACC_PUBLIC, // 类访问修饰符这里是publicfullName, // 类名null, // 类签名这里省略java/lang/Object, // 父类这里是Objectnull); // 实现的接口这里没有实现任何接口// 添加默认构造函数MethodVisitor mv cw.visitMethod(Opcodes.ACC_PUBLIC, init, ()V, null, null);mv.visitVarInsn(Opcodes.ALOAD, 0); // 加载this引用mv.visitMethodInsn(Opcodes.INVOKESPECIAL, java/lang/Object, init, ()V, false); // 调用父类构造函数mv.visitInsn(Opcodes.RETURN); // 返回mv.visitMaxs(1, 1); // 设置最大栈和局部变量大小这里简化处理mv.visitEnd();// 添加sayHello()方法mv cw.visitMethod(Opcodes.ACC_PUBLIC, sayHello, ()V, null, null);mv.visitFieldInsn(Opcodes.GETSTATIC, java/lang/System, out, Ljava/io/PrintStream;);mv.visitLdcInsn(Hello, World!); // 将字符串常量推入栈顶mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, java/io/PrintStream, println, (Ljava/lang/String;)V, false); // 调用println方法mv.visitInsn(Opcodes.RETURN);mv.visitMaxs(2, 1); // 设置最大栈和局部变量大小mv.visitEnd();// 结束类定义cw.visitEnd();// 生成字节码到文件byte[] code cw.toByteArray();FileOutputStream fos new FileOutputStream(target/classes/fullName .class);fos.write(code);fos.close();System.out.println(Generated class file: className .class);// 加载ExampleClassClass? exampleClass Class.forName(className); // 注意这里的类名不需要加.class// 创建ExampleClass的实例Object instance exampleClass.getDeclaredConstructor().newInstance();// 获取sayHello方法Method sayHelloMethod exampleClass.getMethod(sayHello);// 调用sayHello方法sayHelloMethod.invoke(instance);} CGlib (Code Generation Library) 是一个强大的高性能的代码生成库它为Java语言提供了一个非常便利的API来扩展Java类与实现接口。不同于ASM库直接操作字节码CGlib采取了更高层次的抽象使得开发者可以以面向对象的方式创建代理类或者子类而无需了解底层字节码的细节。CGlib主要用于以下几个场景 动态代理当不能使用Java原生的java.lang.reflect.Proxy仅能代理实现了接口的类时CGlib可以创建目标类的子类作为代理因此适用于没有实现接口的类的增强。 AOP面向切面编程在AOP框架中如Spring AOP默认情况下使用JDK动态代理但若目标对象没有实现接口则转而使用CGlib来创建代理对象实现在方法前后插入自定义逻辑如日志记录、事务管理等。 持久化框架一些ORM对象关系映射框架如Hibernate的动态代理功能可能会用到CGlib来实现延迟加载等特性。 其他框架与库许多Java应用框架如Spring、MyBatis等都可能间接使用CGlib来增强或代理对象。
使用cglib创建代理
依赖 dependency groupIdcglib/groupId artifactIdcglib/artifactId version3.3.0/version /dependency public class CGlibProxyExample implements MethodInterceptor {public Object getProxy(Class clazz) {Enhancer enhancer new Enhancer();enhancer.setSuperclass(clazz);// enhancer.setInterfaces(new Class[]{SomeInterface.class});// 设置回调方法enhancer.setCallback(this);// 创建并返回代理对象return enhancer.create();}Overridepublic Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {System.out.println(Before method execution);Object result proxy.invokeSuper(obj, args); // 调用原始方法System.out.println(After method execution);return result;}public static void main(String[] args) {CGlibProxyExample example new CGlibProxyExample();SomeService proxy (SomeService) example.getProxy(SomeService.class);proxy.doSomething();// ((SomeInterface)proxy).doOtherSomething();}
}public class SomeService {public void doSomething() {System.out.println(do something exe);}
}