您现在的位置是:首页 > 编程 > 

JDK动态代理和cglib动态代理

2025-07-26 15:40:58
JDK动态代理和cglib动态代理 JDK动态代理1、目标对象必须实现接口 2、利用jdk的api,动态的在内存中构建代理对象 、JDK代理也叫接口代理代码语言:javascript代码运行次数:0运行复制//目标接口 public interface ITeach { void study(); } //目标类 public class Teach implements ITeac

JDK动态代理和cglib动态代理

JDK动态代理

1、目标对象必须实现接口 2、利用jdk的api,动态的在内存中构建代理对象 、JDK代理也叫接口代理

代码语言:javascript代码运行次数:0运行复制
//目标接口
public interface ITeach {
    void study();
}
//目标类
public class Teach implements ITeach {
    @Override
    public void study() {
        println("老师正在学习");
    }
}
//代理类
public class DynamicProxy {
    //目标对象
    private Object target;
    public DynamicProxy(Object target) {
         = target;
    }
    //为目标对象生产代理对象
    public Object getProxyInstance(){
        /**
         * 1.指定当前目标对象使用的类加载器
         * 2.目标对象实现的接口类型
         * .事情处理,执行目标对象方法时,会触发事情处理器方法(会把当前执行的目标对象方法作为参数传入)
         */
        return (getClassLoader(), target.getClass().getInterfaces(), (proxy, method, args) -> {
            println("JDK动态代理开始");
            Object result = method.invoke(target, args);
            println("JDK动态代理结束");
            return result;
        });
    };
}

public class Client {
    public static void main(String[] args) {
        ITeach teach = new Teach();
        DynamicProxy proxy = new DynamicProxy(teach);
        ITeach obj = (ITeach) proxy.getProxyInstance();
        obj.study();
    }
}

结果:
JDK动态代理开始
老师正在学习
JDK动态代理结束

ps:如果在Teach中添加方法,而ITeach中没有。生成代理对象强转为Teach就会报错。 故:代理只能代理接口中的方法,所以又叫接口代理。

cglib代理

1、目标对象可以不用实现接口 目标接口和目标类还是ITeach和Teach

代码语言:javascript代码运行次数:0运行复制
public class CglibProxy implements MethodInterceptor {
    //目标对象
    private Object target;
    public CglibProxy(Object target) {
         = target;
    }
    //为目标对象生产代理对象
    public Object getProxyInstance(){
        //创建一个工具
        Enhancer enhancer = new Enhancer();
        //设置父类
        enhancer.setSuperclass(target.getClass());
        //设置回调函数
        enhancer.setCallback(this);
        //创建代理对象
        return ();
    }
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        println("Cglib动态代理开始");
        Object result = method.invoke(target, objects);
        println("Cglib动态代理结束");
        return result;
    }
}

public class Client {
    public static void main(String[] args) {
        ITeach teach = new Teach();
        CglibProxy proxy = new CglibProxy(teach);
        Teach obj = (Teach) proxy.getProxyInstance();
        obj.study();
    }
}

结果:
Cglib动态代理开始
老师正在学习
Cglib动态代理结束
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2025-01-20,如有侵权请联系 cloudcommunity@tencent 删除接口jdk代理动态代理对象

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1163064.html

相关标签:无
上传时间: 2025-07-20 21:10:47
留言与评论(共有 5 条评论)
本站网友 镜像浏览器
3分钟前 发表
method
本站网友 青岛二手房信息
17分钟前 发表
原始发表:2025-01-20
本站网友 西安医学高等专科学校
3分钟前 发表
而ITeach中没有
本站网友 单核细胞
30分钟前 发表
method