jdk和cglib动态代理实现

/**
 * 1)、JDK和CGLib的区别
 *
 * JDK动态代理只能对实现了接口的类生成代理,而不能针对类
 * CGLib是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法(继承)
 * 2)、Spring在选择用JDK还是CGLib的依据
 *
 * 当Bean实现接口时,Spring就会用JDK的动态代理
 * 当Bean没有实现接口时,Spring使用CGLib来实现
 * 可以强制使用CGLib(在Spring配置中加入<aop:aspectj-autoproxy proxy-target-class=“true”/>)
 * 3)、JDK和CGLib的性能对比
 *
 * 使用CGLib实现动态代理,CGLib底层采用ASM字节码生成框架,使用字节码技术生成代理类,在JDK1.6之前比使用Java反射效率要高。唯一需要注意的是,CGLib不能对声明为final的方法进行代理,因为CGLib原理是动态生成被代理类的子类。
 * 在JDK1.6、JDK1.7、JDK1.8逐步对JDK动态代理优化之后,在调用次数较少的情况下,JDK代理效率高于CGLib代理效率,只有当进行大量调用的时候,JDK1.6和JDK1.7比CGLib代理效率低一点,但是到JDK1.8的时候,JDK代理效率高于CGLib代理
 */
//用户管理接口
public interface UserManager {
    //新增用户抽象方法
    void addUser(String userName, String password);
    //删除用户抽象方法
    void delUser(String userName);

}


//用户管理实现类,实现用户管理接口
public class UserManagerImpl implements UserManager {
    //重写新增用户方法
    @Override
    public void addUser(String userName, String password) {
        System.out.println("调用了新增的方法!");
        System.out.println("传入参数为 userName: " + userName + " password: " + password);
    }

    //重写删除用户方法
    @Override
    public void delUser(String userName) {
        System.out.println("调用了删除的方法!");
        System.out.println("传入参数为 userName: " + userName);
    }

}



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

//JDK动态代理实现InvocationHandler接口
public class JdkProxy implements InvocationHandler {
    private Object target;//需要代理的目标对象

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = null;
        if (method.getName().contains("add")) {
            System.out.println("JDK动态代理,监听开始!...add...");
            result = method.invoke(target, args);
            System.out.println("JDK动态代理,监听结束!...add...");
        } else if (method.getName().contains("del")){
            System.out.println("JDK动态代理,监听开始!...del...");
            result = method.invoke(target, args);
            System.out.println("JDK动态代理,监听结束!...del...");
        }
        return result;
    }

    //定义获取代理对象方法
    private Object getJDKProxy(Object targetObject) {
        //为目标对象target赋值
        this.target = targetObject;
        //JDK动态代理只能针对实现了接口的类进行代理,newProxyInstance 函数所需参数就可看出
        return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), targetObject.getClass().getInterfaces(), this);
    }

    public static void main(String[] args) {
        JdkProxy jdkProxy = new JdkProxy();//实例化JDKProxy对象
        UserManager user = (UserManager) jdkProxy.getJDKProxy(new UserManagerImpl());//获取代理对象
        user.addUser("admin", "123123");//执行新增方法
        System.out.println("******************************");
        user.delUser("admin");
    }

}



import java.lang.reflect.Method;

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

//Cglib动态代理,实现MethodInterceptor接口
public class CglibProxy implements MethodInterceptor {
    private Object target;//需要代理的目标对象

    //重写拦截方法
    @Override
    public Object intercept(Object obj, Method method, Object[] arr, MethodProxy proxy) throws Throwable {
        Object invoke = null;
        if (method.getName().contains("add")) {
            System.out.println("Cglib动态代理,监听开始!...add...");
            invoke = method.invoke(target, arr);//方法执行,参数:target 目标对象 arr参数数组
            System.out.println("Cglib动态代理,监听结束!...add...");
        } else if (method.getName().contains("del")) {
            System.out.println("Cglib动态代理,监听开始!...del...");
            invoke = method.invoke(target, arr);//方法执行,参数:target 目标对象 arr参数数组
            System.out.println("Cglib动态代理,监听结束!...del...");
        }
        return invoke;
    }

    //定义获取代理对象方法
    public Object getCglibProxy(Object objectTarget) {
        //为目标对象target赋值
        this.target = objectTarget;
        Enhancer enhancer = new Enhancer();
        //设置父类,因为Cglib是针对指定的类生成一个子类,所以需要指定父类
        enhancer.setSuperclass(objectTarget.getClass());
        enhancer.setCallback(this);// 设置回调
        Object result = enhancer.create();//创建并返回代理对象
        return result;
    }

    public static void main(String[] args) {
        CglibProxy cglib = new CglibProxy();//实例化CglibProxy对象
        UserManager user = (UserManager) cglib.getCglibProxy(new UserManagerImpl());//获取代理对象
        user.addUser("admin", "admin");
        user.delUser("admin");//执行删除方法

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值