Java 之动态代理两种实现方法---JDK、CGLIB

一, 动静态代理的区别

  1. 静态代理通常只代理一个类,动态代理是代理一个接口下的多个实现类。
  2. 静态代理事先知道要代理的是什么,而动态代理不知道要代理什么东西,只有在运行时才知道。

二,Java 中的动态代理有两种实现方式:

      1,JDK动态代理实现:实现JDK里面的 InvocationHandler 接口的 invoke 的方法 ,但注意代理的是接口。你的业务类必须实现该接口,才能通过 Proxy 里的 newProxyInstance 得到代理对象。

     2, CGLIB动态代理实现:代理的是类,不需要业务继承接口,通过派生的子类来实现代理。通过在运行时,动态修改字节码达到修改类的目的。

AOP 编程就是基于动态代理实现的,比如著名的 Spring 框架、Hibernate 框架等等都是动态代理的使用例子。

三,两种方法的各自实现:

1,JDK实现写一个 ArrayList 的动态代理类

final List<String> list = new ArrayList<String>();
List<String> proxyInstance = 
(List<String>)Proxy.newProxyInstance(list.getClass().getClassLoader(),
list.getClass().getInterfaces(), 
new InvocationHandler() {
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    return method.invoke(list, args);
}});
proxyInstance.add("你好");
System.out.println(list);
 

2,CGLIB动态代理实现:编写方法拦截器:

​
package com;

import java.lang.reflect.Method;

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

public class MethodInterceptorImpl implements MethodInterceptor{

    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("这里是对目标类进行增强开始!!!");
        //注意这里的方法调用,不是用反射哦!!!
        Object object = proxy.invokeSuper(obj, args);
        System.out.println("这里是对目标类进行增强结束!!!");
        return object;
    }  
}

​

使用连接器进行动态代理

public static void main(String[] args) {
        //创建Enhancer对象,类似于JDK动态代理的Proxy类,下一步就是设置几个参数
        Enhancer enhancer = new Enhancer();
        //设置目标类的字节码文件
        enhancer.setSuperclass(Students.class);
        //设置回调函数
        enhancer.setCallback(new MyMethodInterceptor());
        
        //这里的creat方法就是正式创建代理类
        Dog proxyDog = (Dog)enhancer.create();
        //调用代理类的eat方法
        proxyDog.eat();       
    }

 

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值