JAVA JDK CGLIB 动态代理 比较

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实现反射,如我上面注释掉的那行。




先写到这,之后抽时间总结下,感觉比较散乱。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值