10043---java动态代理(cglib)
来源:互联网 发布:淘宝详情页分辨率 编辑:程序博客网 时间:2024/05/23 13:16
原文
java提供的基于Proxy、InvocationHandler的动态代理由于只能创建接口的代理对象,在实际应用中不能很好的满足需要,针对这个问题,另外一个开源框架cglib提供了一种实现方式,可以针对类进行代理对象的创建。
cglib官方网站:http://sourceforge.net/projects/cglib/files/
另外cglib依赖于asm(http://asm.ow2.org/)。
cglib使用示例:
HelloWorld.javapublic class HelloWorld{ public String sayHello(String name){ System.out.println("执行sayHello()"); return "hello,"+name; } }拦截器MyMethodInterceptor.java
import java.lang.reflect.Method; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; public class MyMethodInterceptor implements MethodInterceptor{ /* * obj 代理对象实例 * method 源对象的方法名 * args 传递给方法的实际入参 * proxyMethod 与源对象中的method相对应的代理对象中的方法 */ public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println("执行方法"+method+"前"); //执行源对象的method方法 Object returnValue = proxy.invokeSuper(obj, args); System.out.println("执行方法"+method+"后"); return returnValue; } }代理工厂ProxyFactory.java
import net.sf.cglib.proxy.Enhancer;public class ProxyFactory {/* * 获得代理对象 */public static Object getProxyObj(String clazz) throws Exception{Class<?> superClass = Class.forName(clazz);Enhancer hancer = new Enhancer();//设置代理对象的父类hancer.setSuperclass(superClass);//设置回调对象,即调用代理对象里面的方法时,实际上执行的是回调对象(里的intercept方法)。hancer.setCallback(new MyMethodInterceptor());//创建代理对象return hancer.create();}}
测试类:
public class Test {public static void main(String[] args) {try {HelloWorld hello = (HelloWorld) ProxyFactory.getProxyObj(HelloWorld.class.getName());System.out.println(hello.sayHello("huangqiqing"));} catch (Exception e) {e.printStackTrace();}}}
输出结果:
执行方法public java.lang.String HelloWorld.sayHello(java.lang.String)前
执行sayHello()
执行方法public java.lang.String HelloWorld.sayHello(java.lang.String)后
hello,huangqiqing
执行方法protected void java.lang.Object.finalize() throws java.lang.Throwable前
执行方法protected void java.lang.Object.finalize() throws java.lang.Throwable后
0 0
- 10043---java动态代理(cglib)
- Java 动态代理 (CGLIB代理)
- java代理(三)--cglib动态代理
- 【Java】CGlib动态代理
- Java-CGLib动态代理
- CGLib动态代理 java
- Java动态代理--cglib代理
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- Spring 事务传播机制 实例讲解
- [AngularJS面面观] 5. scope中的两个异步方法 - $applyAsync以及$evalAsync
- 求二叉树的高度
- matlab GUI界面设计 点击按钮加载.mat数据的所有变量到工作空间中
- 欢迎使用CSDN-markdown编辑器
- 10043---java动态代理(cglib)
- 1711 Number Sequence
- javascript编写方式及基本类型,引用类型
- 编程中常用的小技巧
- 第14周项目2--两个成员的类模板(2)
- Implement Stack using Queues
- iOS监听模式系列之推送消息通知
- Swift基础二
- 上下文ContextMenu