两种动态代理方式:JDK动态代理+Cglib动态代理

Java动态代理

通过对目标类进行代理,扩展出更多操作

2种动态代理实现方式

Jdk动态代理的目标对象,需要有实现接口,否则只能使用Cglib动态代理,核心:InvocationHandler接口,Proxy类
Cglib动态代理,目标对象不需要有实现接口,可通过目标对象.class对象,生成子代理对象。通过继承方式做动态代理,private 和final修饰的类不能实现Cglib代理。核心:MethodInterceptor接口,Enhancer类
JDK代理比CGLIB代理执行速度快,但性能不如CGLIB

JDK动态代理

一 步骤
  1. 实现InvocationHandler接口,定义动态代理类
  2. 对invoke()方法进行修改
  3. 返回一个代理对象
二 实现
package jdkactiveproxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 *  该动态代理为JDK动态代理,JDK动态代理需要代理对象(目标)有实现接口
 */
public class JdkProxy implements InvocationHandler {
	// 目标对象
    private Rank rank;
    // 
    JdkProxy(Rank rank){
        this.rank = rank;
    }
	// 返回代理对象
    public Object getProxy(){
    	// 使用Proxy对象创建代理对象.
    	// 1-3参数分别为:任意类的类加载器,目标对象继承接口,InvocationHandler实现类(在此为JdkProxy本身)
        return Proxy.newProxyInstance(Host.class.getClassLoader(),rank.getClass().getInterfaces(),this);
    }
    
	// 代理对象执行目标方法时,调用此方法
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("hell执行之前");
        // 目标方法执行
        Object result = method.invoke(rank,args);
        System.out.println("hell执行之后");
        return result;
    }

    public static void main(String[] args) {
    	// 创建目标方法
        Host host = new Host();
        // 创建代理类
        JdkProxy jdkProxy = new JdkProxy(host);
        // 获取代理对象
        Rank o = (Rank) jdkProxy.getProxy();
        o.hell();
    }
}

CGLIB动态代理

<!-- cglib 动态代理所需依赖 -->
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>3.1</version>
            <scope>compile</scope>
        </dependency>
一 步骤
  1. 实现MethodInterceptor接口,的代理类
  2. 重写intercept()方法
  3. 通过Enhancer类,创建代理子类
二 代码实现
package cglibactiveproxy;

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

import java.lang.reflect.Method;

public class CglibProxy implements MethodInterceptor {

    // 目标对象(被代理对象)
    private Target target;

    // 代理对象执行方法时,会调用该方法,在被代理对象前后作代理
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("hello方法执行前");
        // 代理对象执行方法
        Object result = method.invoke(target,objects);
        System.out.println("hello方法执行后");
        return result;
    }

    // 获取代理对象
    private Object getProxy(Object target){
        this.target = (Target) target;
        Enhancer enhancer = new Enhancer();
        // 根据目标对象的class类,生成该类的代理子类
        enhancer.setSuperclass(target.getClass());
        // 回调; 实现MethodInterceptor的类放入其中
        enhancer.setCallback(this);
        // 创建并返回代理对象
        return enhancer.create();
    }

    public static void main(String[] args) {
        // 创建目标对象
        Target target = new Target();
        // 创建代理类
        CglibProxy cglibProxy = new CglibProxy();
        // 生成代理对象
        Target proxy = (Target) cglibProxy.getProxy(target);
        // 代理对象执行方法
        proxy.hello("wanggui");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值