您的位置:首页 > 编程语言 > Java开发

JAVA JDK CGLIB 动态代理 比较

2016-07-01 10:59 435 查看
1.  jdk   cglib 动态代理区别

jdk的动态代理要求委托类必须实现接口才行

cglib是对委托类生成其子类,不需要委托类实现接口,但委托类不能是final的。

另个人理解 代理 同 装饰模式有点混淆

2.  示例

jdk

package com.zybros.test.service;

public interface IPeople {

    

    public void eat(String s);

    

    public void say(String s);

}

package com.zybros.test.service;

public class PeopleImpl implements IPeople {

    @Override

    public void eat(String s) {

        // TODO Auto-generated method stub

        

        

        System.out.println("**** eat **** "+s);

        

    }

    @Override

    public void say(String s) {

        // TODO Auto-generated method stub

        

        System.out.println("**** say **** "+s);

        

    }

}

package com.zybros.test.jdk;

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

import java.lang.reflect.Proxy;

public class PeopleProxy implements InvocationHandler {

    

    private Object target ;

    

    public Object getProxy(Object target){

        

        this.target = target;

        

        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),this);

    }

    @Override

    public Object invoke(Object p , Method method, Object[] args)

            throws Throwable {

        

        this.before();

        

        method.invoke(target, args);

        

        this.after();

        

        return target;

    }

    

    

    private void before(){

        

        System.out.println("**** jdk proxy  before ****");

        

    }

    

    

    private void after(){

        

        System.out.println("**** jdk proxy  after ****");

        

    }

    

    

}



package com.zybros.test.jdk;

import com.zybros.test.service.IPeople;

import com.zybros.test.service.PeopleImpl;

public class ProxyTest {

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        

        PeopleProxy proxy = new PeopleProxy();

        IPeople p  = (IPeople) proxy.getProxy(new PeopleImpl());

        

        p.eat (" bread ");

        

        p.say (" hello ");

    }

}

输出 

**** jdk proxy  before ****

**** eat ****  bread

**** jdk proxy  after ****

**** jdk proxy  before ****

**** say ****  hello

**** jdk proxy  after ****

cglib

因为委托类是一样的,就不在重复贴了,具体看上面  IPeople.java   PeopleImpl.java

package com.zybros.test.cglib;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;

import net.sf.cglib.proxy.MethodInterceptor;

import net.sf.cglib.proxy.MethodProxy;

public class PeopleProxyCglib implements MethodInterceptor {

    

    private Object target;

    

    public Object getProxy(Object target){

        this.target = target;

        

        Enhancer enhancer = new Enhancer();

        enhancer.setSuperclass(target.getClass());

        enhancer.setCallback(this);

        return enhancer.create();

    }

    @Override

    public Object intercept(Object obj, Method m, Object[] arg,

            MethodProxy p) throws Throwable {

        

        this.before();

        

        p.invokeSuper(obj, arg);

        

      //  m.invoke(target, arg);

        

        this.after();

        

        return null;

    }

    

    private void before(){

        

        System.out.println("**** cglib proxy  before ****");

        

    }

    

    

    private void after(){

        

        System.out.println("**** cglib proxy  after ****");

        

    }

}



package com.zybros.test.cglib;

import com.zybros.test.service.IPeople;

import com.zybros.test.service.PeopleImpl;

public class ProxyTest {

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        

        PeopleProxyCglib proxy = new PeopleProxyCglib();

        IPeople p  = (IPeople) proxy.getProxy(new PeopleImpl());

        

        p.eat (" bread ");

        

        p.say (" hello ");

    }

}

输出:

**** cglib proxy  before ****

**** eat ****  bread

**** cglib proxy  after ****

**** cglib proxy  before ****

**** say ****  hello

**** cglib proxy  after ****

注:cglib 的代理拦截intercept方法中,也可以用jdk的method实现反射,如我上面注释掉的那行。



先写到这,之后抽时间总结下,感觉比较散乱。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: