动态代理

①动态代理概念理解

动态代理是一种方便运行时动态构建代理、动态处理代理方法调用的机制,很多场景都利用类似机制做到的,比如用来包装RPC调用、面向切面的变成(AOP)

实现动态代理的方式很多,比如JDK自身提供的动态代理,就是主要利用了下面提到的反射机制。还有其他的实现方式,比如利用更高性能的字节码操作机制,类似ASM、cglib(基于ASM)、Javaassist 等。

②Java 动态代理的作用是什么?

主要用来做方法的增强,让你可以在不修改源码的情况下,增强一些方法,在方法执行前后做任何你想做的事情,甚至根本不去执行这个方法,因为在InvocationHandler的invoke方法中,可以直接获取政治调用方法对应的Method对象,具体应用的话,可以添加调用日志,做事务控制等。

动态代理是设计模式当中代理模式的一种。(代理设计模式:为其他对象提供一种代理以控制这个对象的访问)

Java的动态代理是基于java.lang.reflect.Proxy、java.lang.reflect.invocationHandler两个类来完成的,使用了反射机制。

③代理模式

通过代理模式默默的解决一些与业务无关的问题,比如远程、安全、事务、日志、资源关闭等,让应用开发者可以只关注他的业务。

----静态代理:事先写好代理类,可以手工编写,也可以工具生成。缺点是每个业务类都要对应一个代理类,非常不灵活。

----动态代理:运行时自动生成代理对象。缺点是生成代理对象和调用代理方法都要额外花费时间。

----JDK动态代理:基于Java 反射机制实现,必须要了解接口的业务类型才能用这种办法生成代理对象。新版本也开始结合ASM机制。

----cglib动态代理: 基于ASM机制实现,通过生成业务类的子类作为代理类。

 反射机制

① 引入

Java的反射机制在平时的业务开发过程中很少用到,但是在一些基础框架的搭建上应用非常广泛

②什么是Java反射机制

Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

③反射机制提供了哪些功能

----在运行时判定任意一个对象所属的类

----在运行时构造任意一个类的对象

----在运行时判定任意一个类所具有的成员变量和方法

----在运行时调用任意一个对象的方法

----生成动态代理

④ 反射机制的应用场景

----动态代理(AOP、RPC)

----提供第三方开发者扩展能力(Servlet容器、JDBC连接)

----第三方组件创建对象(OI)

----逆向代码,例如反编译

----与注解相结合的框架,例如Retrofit

----单纯的反射机制应用框架,例如EventBus 2.x

----动态生成类框架 例如Gson

⑤反射机制的优缺点:

----优点:运行期类型的判断,动态类加载,动态代理使用反射

----缺点:性能是一个问题,反射相当于一系列解释操作,通知jvm要做的事情,性能比直接的java代码要慢很多。

Java 动态代理是基于什么原理的更多相关文章

  1. 大厂高级工程师面试必问系列:Java动态代理机制和实现原理详解

    代理模式 Java动态代理运用了设计模式中常用的代理模式 代理模式: 目的就是为其他对象提供一个代理用来控制对某个真实对象的访问 代理类的作用: 为委托类预处理消息 过滤消息并转发消息 进行消息被委托 ...

  2. java面试题(杨晓峰)---第六讲谈谈动态代理是基于什么原理?

    我在编译时不知道,而在运行时知道,那么肯定在运行时给了提示,这个提示就是额外功.好处是可以重复利用相同代码. 代理模式:通过代理静默的解决一些与业务无关的问题,例如远程,安全,事物,日志,资源关闭,. ...

  3. java动态代理的实现以及原理

    1.前言 之前对动态代理的技术只是表面上理解,没有形成一个体系,这里总结一下,整个动态代理的实现以及实现原理,以表述的更清楚一些. 2.动态代理的实现应用到的技术 1.动态编译技术,可以使用Java自 ...

  4. [转]Java动态代理

    动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询.测试框架的后端mock.RPC,Java注解对象获取等.静态代理的代理关系在编译时就确定了,而动态代理的代理关 ...

  5. java 基础之--java动态代理

    1.抽象角色:声明真实对象与代理对象的共同接口: 2.代理角色:相当于中介的作用,bridge,内部包含对真实角色的reference,在执行真实操作对象时,附加其他操作,相当于对真实角色的封装: 3 ...

  6. Java动态代理——框架中的应用场景和基本原理

    前言 之前已经用了5篇文章完整解释了java动态代理的原理,本文将会为这个系列补上最后一块拼图,展示java动态代理的使用方式和应用场景 主要分为以下4个部分 1.为什么要使用java动态代理 2.如 ...

  7. JAVA 动态代理原理和实现

    在 Java 中动态代理和代理都很常见,几乎是所有主流框架都用到过的知识.在面试中也是经常被提到的话题,于是便总结了本文. Java动态代理的基本原理为:被代理对象需要实现某个接口(这是前提),代理对 ...

  8. Java 动态代理原理图解 (附:2种实现方式详细对比)

    ​ 动态代理在 Java 中有着广泛的应用,例如:Spring AOP 面向切面编程,Hibernate 数据查询.以及 RPC Dubbo 远程调用等,都有非常多的实际应用@mikechen 目录 ...

  9. java动态代理原理

    我们经常会用到Java的动态代理技术, 虽然会使用, 但是自己对其中的原理却不是很了解.比如代理对象是如何产生的, InvocationHandler的invoke方法是如何调用的?今天就来深究下Ja ...

随机推荐

  1. Python 入门(九)迭代

    什么是迭代 在Python中,如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们成为迭代(Iteration). 在Python中,迭代是通过 for ...

  2. git 提交代码出现git Permission to Xx denied to Xx 错误

    http://blog.csdn.net/chen_xi_hao/article/details/71172279

  3. ubuntu系统无eth0网卡解决办法

    ubuntu终端下命令ifconfig的问题解决 问题一. ifconfig之后只显示lo,没有看到eth0 问题二. ifconfig之后显示eth0,但是没有显示静态IP地址,即无inet.地址. ...

  4. 实现类似printf这样的函数

    来源:http://www.vimer.cn/2009/12/cc%E5%AE%9E%E7%8E%B0%E5%A4%9A%E5%8F%82%E6%95%B0%E5%87%BD%E6%95%B0%E7% ...

  5. x64dbg使用心得

    使用ScyllaHide插件时 注意一下事项 xdbg64设置里启动 附加必须第一次断下在 系统断点 然后再启用ScyllaHide. 停止调试 脱离时.必须关闭ScyllaHide 否则会报异常 x ...

  6. JS-匀速运动-运动停止

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. Bettercap的安装和使用嗅探WIFI

    一.首先安装bettercap 我这里的环境是ubuntu 16.04 apt-get install build-essential ruby-dev libpcap-dev git ruby ge ...

  8. mysql 之 group by 性能优化 查询与统计分离

    背景介绍 记录共128W条!   SELECT cpe_id, COUNT(*) restarts FROM business_log WHERE operate_time>='2012-12- ...

  9. centos7.2启动级别

    systemctl set-default multi-user.target      设定默认为字符界面,也就是3 systemctl set-default graphical.target  ...

  10. Floyd算法并输出路径

    hdu1224 Free DIY Tour Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Ot ...