JDK动态代理模式和CGLIB代理

本文先举例子:后续跟进讲解内容,参考TOM老师


xiaoming是根据JDK媒婆代理找媳妇,要实现InvocationHandler接口

zhangsan时根据cglib媒婆代理找媳妇,无需实现接口

JDK代理如下:

package jdkProxy;

public interface Person {
    public void findJob();
}
package jdkProxy;

/**
 *小明找对象
 */
public class XiaoMing implements Person {
    public void findJob(){
        System.out.println("我叫小明,我找对象要求是白富美");
    }
}
package jdkProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 媒婆代理,需要实现 InvocationHandler
 */
public class JDKMeiPo implements InvocationHandler
{
    private XiaoMing target;

    /**
     * @param target
     * @return 返回动态代理对象
     * @throws Exception
     */
    public Object getInstance(XiaoMing target) throws Exception{

        this.target = target;

        //创建一个动态代理对象,该动态代理实现了interfaces指定的系列接口,
        // 执行动态代理对象的每个方法时都会被替换成执行InvocationHandler的对象的invoke方法
        Object o = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),this);
        return o;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("我是JDK媒婆,请说出你的需求。。。");
        //反射执行方法
        method.invoke(target,args);

        System.out.println("现在开始物色");

        return null;
    }
}

package jdkProxy;

/**
 * 动态代理的测试类
 */
public class MainTest {

    public static void main(String[] args) throws Exception {
        JDKMeiPo meiPo = new JDKMeiPo();
        Person o = (Person)meiPo.getInstance(new XiaoMing());
        o.findJob();
    }
}

输出结果

我是JDK媒婆,请说出你的需求。。。
我叫小明,我找对象要求是白富美
现在开始物色

CGLIB代理如下:

package cglib;

public class Zhangsan {
    public void findLove(){
        System.out.println("我是张三,我的要求是钱钱钱要有钱");
    }
}
package cglib;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * Cglib实现的媒婆
 */
public class CgLibMeiPo implements MethodInterceptor {
    public Object getInstance(Class<?> clazz) throws Exception{

        Enhancer enhancer = new Enhancer();
        //设置代理目标
        enhancer.setSuperclass(clazz);
        //设置回调
        enhancer.setCallback(this);

        return enhancer.create();

    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        //业务的增强

        System.out.println("我是CGLIB媒婆,请说出你的需求。。。");
        //反射执行方法
        methodProxy.invokeSuper(o,objects);

        System.out.println("现在开始物色");

        return null;
    }
}
package cglib;

public class TestCGLIB {
    public static void main(String[] args) throws Exception {
        Zhangsan zs = (Zhangsan)new CgLibMeiPo().getInstance(Zhangsan.class);
        zs.findLove();
    }
}

输出结果:

我是CGLIB媒婆,请说出你的需求。。。
我是张三,我的要求是钱钱钱要有钱
现在开始物色

jdk代理源码和手工实现代理需参考TOM老师的代理模式第二讲,后续跟进


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值