首页 > 编程语言 > 详细

java提供类与cglib包实现动态代理

时间:2015-11-27 00:43:52      阅读:479      评论:0      收藏:0      [点我收藏+]

    终于有点空余时间,决定把之前学习的知识点整理一下,备以后复习。

    动态代理有三角色:抽象角色,代理角色,真是角色。

第一个记录下java提供的动态代理。即使用Proxy类和InvocationHandel接口。直接上贴上代码:

class MyInvocationHandel implements InvocationHandler{
    private Object obj; //这是原对象
    //传入源对象,返回代理对象
    public Object bind(Object obj){
        this.obj=obj;
        return Proxy.newProxyInstance(obj.getClass().getClassLoader(),
                obj.getClass().getInterfaces(), this);
    }

    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        System.out.println("用户验证成功");
        Object object=method.invoke(obj, args);
        System.out.println("日志记录:xxx在xx时刻调用了"+method.getName());
        return object;
    }
    
}

 

    通过invocationHandel接口可以代理对象的方法,我们可以加入日志记录等等,代码很简单,功能很强大。

第二个记录下通过cglig包实现的动态代理,比java提供的动态代理优点在于可以提供抽象类方法的代理(不知这样说准确不)。要使用这种代理首先需要导入cglib.jar和asm.jar,然后使用Enhancer类与MethodInterceptor接口,代码:

public class CGlibFactory implements MethodInterceptor{
    private Object targerObj; //原对象
    
        //通过原对象返回代理对象
    public Object createInstance(Object targerObj){
        this.targerObj = targerObj;
        Enhancer en = new Enhancer();
        return en.create(this.targerObj.getClass(),this.targerObj.getClass().getInterfaces(),this);
    }

    public Object intercept(Object proxy, Method method, Object[] args,
            MethodProxy methodProxy) throws Throwable {
        System.out.println("用户验证...");
        Object result= methodProxy.invoke(targerObj, args);
        System.out.println("xx用户调用xx方法");
        return result;
    }
}

 

java提供类与cglib包实现动态代理

原文:http://www.cnblogs.com/zhongkaiuu/p/cglib.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!