什么是java代理?关于这个问题我已经回答过很多次,但许多朋友可能还没有理解,本篇文章再来详细为大家解答一下什么是java代理?等相关问题,希望对大家有所帮助。

什么是java代理?

什么是代理呢,其实很好理解,就是不直接访问目标,而是通过一个中间层来访问,就好像下面这样:

Java的静态代理

举个例子,如果我们一些水果,比如:香蕉、苹果等,写成Java代码,大概是下面这个样子:

吃水果,你要削皮吧,你不能每个水果都写一个子类,类处理削皮这个事情吧。因此,我们可以做一个代理 ,吃苹果之前,先把它削皮。 就像下面这样,把原来的水果包一层:

添加了测试类,测试类如下:

以上就是Java的静态代理,简单点说,就是把原来的目标对象包一层,加入新东西再去调用目标本身。 但是如果只是这样的静态代理,一个接口,就需要一个代理,实现起来是不是很繁琐。

Java的动态代理

在Java中,有一个干这个事情的类,叫做Proxy,可以直接使用反射方式,代理拦截。 先简单的介绍一下这个类,其实最常用的只有一个静态方法Proxt.newProxyInstance(),是这样的:

首先我们要实现InvocationHandler,实现其中的invoke方法,在调用目标对象的时候,会先调用到invoke方法,需要实现者在这个方法中,在主动调用被调用者方法。

运行一下:

这个方法,就是生成一个上文中的PeelFruitProxy(当然,我们看到的他名字叫:com.sun.proxy.$Proxy0),动态的生成,避免每次都需要写,这个也是叫他动态代理的原因,因为我们可以在运行时代理任意类。 很多程序中的AOP就是这样实现的,但是我们发现一些特点,newProxyInstance()的第二个参数,是一个interfaces的列表,为啥要有这个这个列表呢?

因为我们动态生成的代理类,也需要实现接口,这样才方便向下转型,使用其中的方法,不然,生成的类,类名就是com.sun.proxy.$Proxy0这种,并且是在内存中,无法调用生成的方法。 ** 所以,这种动态代理的方法,有一个致命的缺点,那就是被代理的类,必须要实现接口。**

CGLib代理

另一个大名鼎鼎的Java代理实现,就是CGLib(Code Generation Library),一个基于ASM的代码生成框架,可以用他来动态生成类,然后实现对方法的拦截,就可以避开JDK的动态代理, 必须要目标类实现接口的问题了。 也就是说,可以用CGLib来生成上文中的PeelFruitProxy。

简单介绍一下怎么用,首先这个CGLib是一个三方的库,我们要把它依赖进来:

compile 'cglib:cglib:3.2.8'

最新版本可以在这里看(新版本)[https://github.com/cglib/cglib/releases] 然后我们来试一试,我们来实现一下上面的代理

运行效果如下:

我们看到,实现了同样的功能,但是,Apple已经不是原来的Apple类了,变成了com.zjiecode.learn.java.proxy.Apple$$EnhancerByCGLIB$$44ade224,没错,我们正真使用的是这个类,而不是原来的Apple了,这个类继承自Apple,最后实现了对Apple类的代理。 这种方式,因为使用的是继承,所以,无需被代理的类实现接口。当然,他也可以通过接口来实现代理。

总结

第一种代理,就不说了,只适合单一的一个接口的代理,在编译时就决定好了。

第二、三种代理,都是动态时代理 ,但是我们看到也有差别:

1)JDK的动态代理 ,只能实现接口代理,并且是包装的被代理对象(类的实例),也就是说,在代理的过程中,有2个对象,一个代理对象,一个目标对象,目标对象被包装在代理对象里面。

2)CGLib的代理,是继承目标对象,生成了一个新的类,然后来实现代理,这样,在内存中就是有代理对象,没有目标对象了,使用的是直接继承的方式

生成代理类是在运行时,有别于javapoet在编译时生成类。

以上就是什么是java代理的详细内容。

我整理了一些java技术资料和面试题集,供大家提升进阶,不管你是有面试跳槽打算还是单纯精进自己,都可以免费领取一份。

先展示部分截图,文末附免费下载方式

一、JVM篇(2022)

(含:JVM类加载机制,JVM内存模型,垃圾收集机制,类字节码实现机制,JVM调优案例,GC日志详解等)

二、Java并发编程(2022)

(含:java内存模型,并发集合,线程池,阻塞队列,CAS与原子操作,无锁并发框架Disruptor等)

三、Spring篇(2022)

(含:spring IOC,spring AOP原理,spring 5,springMVC,事务管理,循环依赖,spring设计模式等)

四、Mysql篇(2022)

(含:SQL执行原理,索引底层机制,SQL执行计划分析,Mysql锁机制,Mysql事务隔离,SQL优化实践等)

五、SpringCloud篇(2022)

(含:服务发现与注册Eureka与Nacos,服务限流熔断降级Hystrix与Sentinel,分布式事务Seata,网关Gateway等)

六、Dubbo篇(2022)

(含:Dubbo基础,架构设计,集群,配置,通信协议,SPI等)

七、Redis篇(2022)

(含:Redis核心数据结构,Redis持久化机制与安全机制,哨兵与集群架构,Redis缓存穿透,缓存失效,缓存雪崩,Redis缓存设计与性能优化等)

八、分布式篇(2022)

(含:分布式架构原理,集群架构原理,分布式锁,分布式事务,分布式协议,分布式配置,海量数据分库分表,分布式调度,等)

九、设计模式篇(2022)

(含:单例模式,工厂模式,抽象工厂模式,建造者模式,原型模式,适配器模式,装饰器模式,代理模式等23种设计模式)

十、数据结构与算法篇(2022)

(含:红黑树,B+树,贪心算法,哈希分治法,七大查找算法,动态规划,一致性算法等)

十一、MQ篇(2022)

(含:消息丢失,消息重复消费,消息乱序,消息积压,延时队列,消息回溯消费,消息刷盘机制,MQ中间件集群架构原理等)

十二、Netty篇(2022)

(含:BIO、NIO及AIO线程模型,Netty线程模型,序列化协议protobuf,粘包拆包问题,Netty心跳机制,直接内存与Netty零拷贝,WebSocket协议等)

十三、Zookeeper篇(2022)

(含:ZooKeeper选举机制,ZooKeeper数据模型,ZooKeeper应用场景等)

十四、ElasticSearch篇(2022)

(含:ElasticSearch数据模型、ElasticSearch分布式架构、ElasticSearch数据读写原理和段合并等)

十五、网络与操作系统篇(2022)

(含:网络协议,TCP/IP系统结构,TCP/IP协议族,常见面试题,等)

由于篇幅有限,这里只展示部分内容,所有的资料大家点击下方名片即可免费领取。

什么是java代理?相关推荐

  1. java 代理的三种实现方式

    Java 代理模式有如下几种实现方式: 1.静态代理. 2.JDK动态代理. 3.CGLIB动态代理. 示例,有一个打招呼的接口.分别有两个实现,说hello,和握手.代码如下. 接口: public ...

  2. 关于IBM Lotus的JAVA代理进入jar包的说明

    有2种方法,一般用第一种: 方法1: 在JAVA代理里引入JAR包: import javax.rmi.*; //(就是这样引入) public class JavaAgent extends Age ...

  3. 通过 Lotus Domino Java 代理消费 Web 服务

    Web 服务是一种允许两台或更多的计算机在网络中交互的系统设计.这种服务的主要优点是,它是在多台不同操作系统的计算机和应用服务器之间发送对象的标准解决方法.例如,我们的公司使用 Web 服务从一台运行 ...

  4. java编写代理服务器_如何编写Java代理

    java编写代理服务器 对于vmlens (轻量级Java竞争条件捕获器),我们使用Java代理来跟踪字段访问. 这是我们学习的实现此类代理的经验教训. 开始 使用"静态公共静态无效值pre ...

  5. java代理模式_Java代理

    java代理模式 本文是我们名为" 高级Java "的学院课程的一部分. 本课程旨在帮助您最有效地使用Java. 它讨论了高级主题,包括对象创建,并发,序列化,反射等. 它将指导您 ...

  6. Java代理初学者指南

    尽管Java初学者很快学会了键入public static void main来运行他们的应用程序,但是即使是经验丰富的开发人员也常常不知道JVM对Java流程的两个附加入口点的支持: premain ...

  7. 如何编写Java代理

    对于vmlens (轻量级Java竞争条件捕获器),我们使用Java代理来跟踪字段访问. 这是我们学习的实现此类代理的经验教训. 开始 使用" static public static vo ...

  8. java代理通俗简单解析

    1         代理 1.1            代理的概念和作用 代理的概念很好理解,就像黄牛代替票务公司给你提供票,经纪人代理艺人和别人谈合作.Java的代理是指实现类作为代理类的属性对象, ...

  9. Java代理设计模式(Proxy)的具体实现:静态代理和动态代理

    Java代理设计模式(Proxy)的具体实现:静态代理和动态代理 实现方式一:静态代理 静态代理方式的优点 静态代理方式的缺点 Java动态代理实现方式一:InvocationHandler Java ...

  10. java代理机制简单实现

    java代理分静态代理和动态代理,动态代理有jdk代理和cglib代理两种,在运行时生成新的子类class文件.本文主要练习下动态代理,代码用于备忘.对于代理的原理和机制,网上有很多写的很好的,就不班 ...

最新文章

  1. 在spark上构造随机森林模型过程的一点理解
  2. Java根据文件头文件信息判断文件类型
  3. 安装solc模块4.25版本
  4. mysql注入5.0以上_[Injection]对MYSQL 5.0服务器以上版本注入
  5. MATLAB solve函数计算得到lambertw函数,用vpa转换即可
  6. Md5 Loader Demo
  7. 【Linux】 CentOS 7 安装 RabbitMQ
  8. ORA-27101: shared memory realm does not exist 错误的处理(ORA-01034 - Oracle not available )
  9. JSP编程技术4-登录与注销(静态)
  10. Iphone6+ 手机边框图片
  11. 解决无线网络不稳定的两个方案几个方法
  12. 华为交换机路由器consle忘记密码该怎么办?
  13. 喜马拉雅 批量重命名
  14. MIS系统(12)- 订单管理
  15. MySQL服务中断后重启失败及解决办法(个例)
  16. MMDetection(三):公开数据集上测试和训练模型
  17. 解决 cannot connect to 192.168.1.136:5555: 由于目标计算机积极拒绝,无法连接。 (10061)
  18. 梧桐落雨,烟水迷离,莺啼江南岸!
  19. Unity流水账4:Animation API(一)
  20. 考研数学思维导图--一元积分

热门文章

  1. [区块链安全-Ethernaut]附加GoodSamaritan解题思路
  2. 老字号“张小泉”上线小程序与酷客多达成战略合作!
  3. 什么是 Web 3.0:面向未来的去中心化互联网
  4. 科研神器Latex:algorithm2e算法常用技巧小结
  5. 浅谈零知识证明之二:简短无交互证明(SNARK)
  6. 深入剖析Spring架构与设计原理(一)
  7. 工业封装胶粘剂市场现状及未来发展趋势
  8. 【TensorFlow】计算图graph的使用学习笔记(二)
  9. 大数据分析深度学习在自然语言处理NLP中的应用
  10. android半透明闪退,移动端常见面试题一:移动端兼容解决方案