前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >面试官:说说Java中有哪些代理?

面试官:说说Java中有哪些代理?

作者头像
崩天的勾玉
发布于 2021-12-20 09:37:19
发布于 2021-12-20 09:37:19
35400
代码可运行
举报
文章被收录于专栏:崩天的勾玉崩天的勾玉
运行总次数:0
代码可运行
代理类相当于是原本的类的class对象+自定义操作,理解为一层封装。代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。简单的说就是,我们在访问实际对象时,是通过代理对象来访问的,代理模式就是在访问实际对象时引入一定程度的间接性,因为这种间接性,可以附加多种用途。

假如一个班的同学要向老师交班费,但是都是通过班长把自己的钱转交给老师。这里,班长就是代理学生上交班费,班长就是学生的代理。

静态代理

由程序员创建或特定工具自动生成源代码,也就是在编译时就已经将接口,被代理类,代理类等确定下来。在程序运行之前,代理类的.class文件就已经生成。

流程:

  1. 定义一个接口,定义了一个抽象方法。
  2. 被代理类实现了接口,重写了方法。
  3. 代理类也实现接口,然后将被代理类引用,并通过构造方法引入,然后重写方法,此时可以调用被代理类的方法
  4. main方法new了被代理类和代理类两个对象,前者作为参数传给后者,并调用后者的方法。

缺点:每个被代理类都要写一个针对的代理类。

动态代理

代理类在程序运行时创建的代理方式被成为动态代理。动态代理的优势在于可以很方便的对代理类的函数进行统一的处理,而不用修改每个代理类中的方法

若目标对象实现了接口,spring默认使用「JDK的动态代理」

  • 优点:因为有接口,所以使系统更加松耦合;
  • 缺点:为每一个目标类创建接口;

若目标对象没有实现任何接口,spring使用「CGLib动态代理」

  • 优点:因为代理类与目标类是继承关系,所以不需要有接口的存在。
  • 缺点:因为没有使用接口,所以系统的耦合性没有使用JDK的动态代理好。

「1、jdk动态代理」

newProxyInstance()会返回一个实现了指定接口的代理对象,对该对象的所有方法调用都会转发给InvocationHandler.invoke()方法。理解上述代码需要对Java反射机制有一定了解。动态代理神奇的地方就是:

  1. 代理对象是在程序运行时产生的,而不是编译期;
  2. 对代理对象的所有接口方法调用都会转发到InvocationHandler.invoke()方法,在invoke()方法里我们可以加入任何逻辑,比如修改方法参数,加入日志功能、安全检查功能等;之后我们通过某种方式执行真正的方法体,可以通过反射调用对象的相应方法,还可以通过RPC调用远程方法。

使用方法:代理类实现「InvocationHandler」,然后引用被代理类,并在构造方法里传入。然后重写invoke方法,为具体操作代码。然后通过

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Proxy.newProxyInstance(  getClass().getClassLoader(), new Class<?>[] {Hello.class}, // 2. 代理需要实现的接口,可以有多个  
new LogInvocationHandler(new HelloImp()));// 3. 方法调用的实际处理者

Java动态代理是基于接口的,没有实现接口该类无法使用JDK代理,CGLIB登场。

「2、CGLIB动态代理」

CGLib采用非常底层的字节码技术,可以为一个类创建子类,并在子类中采用方法去技术拦截所有的父类方法的调用,并顺势织入横切逻辑。

目标对象:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//目标对象RealSubject,cglib不需要定义目标类的统一接口
public class RealSubject {

    public void request() {
        System.out.println("real subject execute request");
    }

    public void hello() {
        System.out.println("hello");
    }
}

代理对象:实现MethodInterceptor,重写intercept方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//代理对象
public class DemoMethodInterceptor implements MethodInterceptor{
    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("before in cglib");
        Object result = null;
        try{
            result = proxy.invokeSuper(obj, args);
        }catch (Exception e){
            System.out.println("get ex:"+e.getMessage());
            throw e;
        }finally {
            System.out.println("after in cglib");
        }
        return result;
    }
}

客户端调用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//客户端
public class Client {
    public static void main(String[] args){
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(RealSubject.class);
        enhancer.setCallback(new DemoMethodInterceptor());
        // 此刻,realSubject不是单纯的目标类,而是增强过的目标类  
        RealSubject realSubject = (RealSubject) enhancer.create();
        realSubject.hello();
        realSubject.request()
    }
}

也可以通过匿名的方式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

 public static void main(String[] args) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(SampleClass.class);
        enhancer.setCallback(new MethodInterceptor() {
            @Override
            public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
                System.out.println("before method run...");
                Object result = proxy.invokeSuper(obj, args);
                System.out.println("after method run...");
                return result;
            }
        });
        SampleClass sample = (SampleClass) enhancer.create();
        sample.test();
    }

代理的原理可以参考:https://www.cnblogs.com/gonjan-blog/p/6685611.html

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 崩天的勾玉 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
设计模式----代理模式
代理模式,为其他对象提供了一种代理以控制对这个对象的访问。代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗的来讲代理模式就是我们生活中常见的中介。
大忽悠爱学习
2021/11/15
2280
代理模式的使用总结
(三)采用JDK代理实现:JDK动态代理实现InvocationHandler接口
全栈程序员站长
2022/08/10
3800
代理模式的使用总结
​面试必备java代理 万字详解!
​代理其实不仅仅是在软件开发领域,在我们的日常生活中也是时常可见。比如某p2p老板突然携款带着小姨子跑路了,可怜了下面一堆的程序员背负一身房贷,上有老下有小,程序员只能被迫去申请劳动仲裁,劳动局就会为其指派一位代理律师全权负责程序员的仲裁事宜(PS:p2p跑路仲裁拿回工资的可能性非常低,没让你把工资退回就算好的了)。那这里面就是使用了代理模式,因为在劳动仲裁这个活动中,代理律师会全权代理程序员。比如:房东要将房子出售,于是到房地产中介公司找一个中介(代理),由他来帮房东完成销售房屋,签订合同、网签、贷款过户等等事宜。
java金融
2020/05/29
4210
​面试必备java代理 万字详解!
【Java设计模式】之代理模式
代理模式是Java常见的设计模式之一。所谓代理模式是指客户端并不直接调用实际的对象,而是通过调用代理,来间接的调用实际的对象。 为什么要采用这种间接的形式来调用对象呢?一般是因为客户端不想直接访问实际的对象,或者访问实际的对象存在困难,因此通过一个代理对象来完成间接的访问。
用户5640963
2019/07/26
3460
【Java设计模式】之代理模式
傀儡政权之代理模式
代理模式应用非常广泛,特别java领域的Spring框架,可以说把代理模式运用到极致。其中Spring的代理又分JDK动态代理和cglib动态代理。这类不打算深入讲解Spring的动态代理,而是深入讲解一下GOF 23的代理模式。
BUG弄潮儿
2020/12/17
2980
傀儡政权之代理模式
代理、静态、动态
为其他对象提供一种代理以控制这个对象的访问,在某些情况下一个对象不能直接访问那个对象时,代理就起到了客户端和被代理对象 (委托类) 中介作用。
张小驰出没
2021/12/06
2300
代理、静态、动态
代理模式 代理模式
1、远程代理:对一个位于不同地址空间的对象提供一个本地代表,隐藏这个对象存在于不同地址空间的事实,例如RMI的stub(RMI也是比较重要的概念)。这个不同的地址空间可以是在同一主机中,也可以是在不同主机中。
mingmingcome
2021/11/29
3560
代理模式
    





        代理模式
动态代理技术的运用
“ 在前一篇文章我们了解了Spring AOP的简单运用,我们发现面向切面编程的核心是动态代理,我们这篇文章主要就是看一下:JDK自带的动态代理和CGLIB的动态代理”
每天学Java
2020/06/02
2900
23种设计模式(四)-代理模式
一般是因为客户端不想直接访问实际的对象, 或者不方便直接访问实际对象,因此通过一个代理对象来完成间接的访问。
用户7798898
2021/06/24
3560
静态代理和动态代理简介
在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用。代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不能看到的内容和服务或者添加客户需要的额外服务。 代理模式的角色分为: 主题接口: 即代理类的所实现的行为接口。 目标对象: 也就是被代理的对象。 代理对象: 用来封装真是主题类的代理类 客户端:即用来实现的类
SmileNicky
2019/01/17
4870
Java设计模式(八)----代理模式
代理描述 1.生活中: 代理就是一个人或者一个组织代表其他人去做一件事的现实生活中的。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间
汤高
2018/01/11
6810
Java设计模式(八)----代理模式
Spring AOP高级——源码实现(1)动态代理技术
jdk1.8.0_144   在正式进入Spring AOP的源码实现前,我们需要准备一定的基础也就是面向切面编程的核心——动态代理。 动态代理实际上也是一种结构型的设计模式,JDK中已经为我们准备好了这种设计模式,不过这种JDK为我们提供的动态代理有2个缺点: 只能代理实现了接口的目标对象; 基于反射,效率低   鉴于以上2个缺点,于是就出现了第二种动态代理技术——CGLIB(Code Generation Library)。这种代理技术一是不需要目标对象实现接口(这大大扩展了使用范围),二是它是基于字
用户1148394
2018/01/09
8800
Spring AOP高级——源码实现(1)动态代理技术
面试官提问:什么是动态代理?
代理这个词最早出现在代理商这个行业,所谓代理商,简而言之,其实就是帮助企业或者老板打理生意,自己本身不做生产任何商品。
Java极客技术
2022/12/02
1900
面试官提问:什么是动态代理?
终于有人把 Java代理讲清楚了,万字详解!
代理其实不仅仅是在软件开发领域,在我们的日常生活中也是时常可见。比如某p2p老板突然携款带着小姨子跑路了,可怜了下面一堆的程序员背负一身房贷,上有老下有小,程序员只能被迫去申请劳动仲裁,劳动局就会为其指派一位代理律师全权负责程序员的仲裁事宜(PS:p2p跑路仲裁拿回工资的可能性非常低,没让你把工资退回就算好的了)。那这里面就是使用了代理模式,因为在劳动仲裁这个活动中,代理律师会全权代理程序员。比如:房东要将房子出售,于是到房地产中介公司找一个中介(代理),由他来帮房东完成销售房屋,签订合同、网签、贷款过户等等事宜。
程序员小猿
2021/01/19
2990
终于有人把 Java代理讲清楚了,万字详解!
Java 动态代理原理
被代理类和代理类都实现同一个接口,通过在代理类对象中注入一个被代理对象,通过调用代理对象的方法,在其方法中间接调用被代理对象,从而实现代理的作用。
菜皮日记
2023/12/18
1270
Java 动态代理原理
Java Review - 关于代理的二三事儿
代理模式是一种结构型设计模式,其目的是为其他对象提供一种代理以控制对这个对象的访问。
小小工匠
2023/08/15
1880
Java Review - 关于代理的二三事儿
AOP知识梳理
Dubbo 了解过吧,对外提供的服务可能有多个方法,一般我们为了不给调用方埋坑,会在每个方法里把所有异常都 catch 住,只返回一个 result,调用方会根据这个 result 里的 success 判断此次调用是否成功,举个例子
Vincent-yuan
2021/12/16
2870
AOP知识梳理
Java 动态代理详解
动态代理在Java中有着广泛的应用,比如Spring AOP、Hibernate数据查询、测试框架的后端mock、RPC远程调用、Java注解对象获取、日志、用户鉴权、全局性异常处理、性能监控,甚至事务处理等。
小旋锋
2019/01/21
1.1K0
快速理解 Java 静态代理 / 动态代理
在有些情况下,一个客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代理对象。
BUG弄潮儿
2021/04/26
3450
面试官:策略模式和代理模式有什么区别?
大家好,我是田哥,昨天一哥们面试被问到代理模式,刚好,我也正在写《MyBatis源码分析:小白系列》专栏中的代理模式。
田维常
2022/06/13
3870
面试官:策略模式和代理模式有什么区别?
相关推荐
设计模式----代理模式
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文