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.java

public 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
原创粉丝点击