https://blog.csdn.net/mulinsen77/article/details/84730087

https://www.cnblogs.com/cC-Zhou/p/9525638.html

AOP的原理就是动态代理机制。RPC框架也是实现了AOP机制。

静态代理:由程序员创建或工具生成代理类的源码,再编译代理类,即代理类和委托类的关系再程序运行前就已经存在。
动态代理:在运行期间使用动态生成字节码形式,动态创建代理类。使用的工具有 jdkproxy、cglibproxy 等。

静态代理

静态代理的好处

  1. 可以隐藏委托类的具体实现;
  2. 可以在不改变委托类的情况下增加额外的操作。

静态代理:在代码编译时就确定了被代理的类是哪一个。

这个静态代理比较简单,代理类和被代理类实现了同一接口,在代理类的构造函数中定义一个被代理类的对象即可。
Student类:实现Person接口(接口中有sayHello()方法)。
被代理类和Person类就比较简单,这里就不附上源码了。

代理类:StudentProxy类 实现Person接口

/*** 静态代理,这个代理类也必须要实现和被代理类相同的Person接口**/
public class ProxyTest implements Person{   private Person o;   public ProxyTest(Person o){this.o = o;}public static void main(String[] args) {// TODO Auto-generated method stub//s为被代理的对象,某些情况下 我们不希望修改已有的代码,我们采用代理来间接访问Student s = new Student();//创建代理类对象ProxyTest proxy = new ProxyTest(s);//调用代理类对象的方法proxy.sayHello("welcome to java", 20);}@Overridepublic void sayHello(String content, int age) {// TODO Auto-generated method stubSystem.out.println("ProxyTest sayHello begin");//在代理类的方法中 间接访问被代理对象的方法o.sayHello(content, age);System.out.println("ProxyTest sayHello end");}
}

动态代理

动态代理:java的动态代理机制中,有两个重要的类或者接口,一个是InvocationHandler(Interface),还有一个是Proxy(是一个class)。

其中InvocationHandler是每一个动态代理类都必须要实现的接口,我们通过代理对象调用一个方法的时候,该方法就会被转发由InvocationHandler这个接口的invoke方法来调用。
Proxy类,动态的创建一个代理对象的类,它提供了许多方法,我们用的最多的是newProxyInstance方法,该方法的作用就是得到一个动态的代理对象。

动态代理模式主要由四个元素共同组成:
1.接口:定义具体实现的方法
2.被代理类:实现上述接口,执行接口中的方法
3.代理类:实现InvocationHandler,帮助被代理类实现方法。

代理类中要实现的内容有:

  1. 因为动态代理不知道被代理的类是哪一个,所以在实现了InvocationHandler的代理类中定义了一个Object类,在代理类的构函数中作为参数传递进来。
  2. 实现InvocationHandler中的invoke方法。
  3. 写main方法,并在main方法中根据定义的被代理类实现代理类的生成。

动态代理的步骤:

1. 首先获得一个被代理对象的引用,

2. 获得该引用的接口

3. 生成一个类,这个类实现了我们给的代理对象所实现的接口

4. 上述类编译生成了.class字节码供JVM使用

5. 调用上述生成的class

/*** 动态代理类* @author Martina**/
public class MyInvocationHandler implements InvocationHandler{private Object object;public MyInvocationHandler(Object object){this.object = object;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {// TODO Auto-generated method stubSystem.out.println("MyInvocationHandler invoke begin");System.out.println("proxy: "+ proxy.getClass().getName());System.out.println("method: "+ method.getName());for(Object o : args){System.out.println("arg: "+ o);}//通过反射调用 被代理类的方法method.invoke(object, args);System.out.println("MyInvocationHandler invoke end");return null;}public static void main(String [] args){//创建需要被代理的类Student s = new Student();//这一句是生成代理类的class文件,前提是你需要在工程根目录下创建com/sun/proxy目录,不然会报找不到路径的io异常System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles","true");//获得加载被代理类的 类加载器ClassLoader loader = Thread.currentThread().getContextClassLoader();//指明被代理类实现的接口Class<?>[] interfaces = s.getClass().getInterfaces();// 创建被代理类的委托类,之后想要调用被代理类的方法时,都会委托给这个类的invoke(Object proxy, Method method, Object[] args)方法MyInvocationHandler h = new MyInvocationHandler(s);//生成代理类//注意newProxyInstance的三个参数所代表的含义Person proxy = (Person)Proxy.newProxyInstance(loader, interfaces, h);//通过代理类调用 被代理类的方法proxy.sayHello("yujie.wang", 20);proxy.sayGoodBye(true, 100);System.out.println("end");}}

上述代码中的Proxy.newProxyInstance所创建的代理类的位置和怎么输出其名字:
(6)反编译Proxy.newProxyInstance所创建的代理类

//这一句是生成代理类的class文件,前提是你需要在工程根目录下创建com/sun/proxy目录,不然会报找不到路径的io异常
System.getProperties().put(“sun.misc.ProxyGenerator.saveGeneratedFiles”,“true”);

我们在代码中加入上述代码,代码就会保存生成的代理类,名称为$Proxy0.class


 对于生成的Proxy0.class文件,可以用java反编译工具jd−gui−0.3.3.windows查看 要记住,通过Proxy.newProxyInstance创建的代理对象是在jvm运行时动态生成的一个对象,它并不是我们的InvocationHandler类型,也不是我们定义的那组接口的类型,而是在运行是动态生成的一个对象,并且命名方式都是这样的形式,以Proxy0.class文件,可以用java反编译工具jd-gui-0.3.3.windows查看 要记住,通过 Proxy.newProxyInstance 创建的代理对象是在jvm运行时动态生成的一个对象,它并不是我们的InvocationHandler类型,也不是我们定义的那组接口的类型,而是在运行是动态生成的一个对象,并且命名方式都是这样的形式,以Proxy0.class文件,可以用java反编译工具jd−gui−0.3.3.windows查看 要记住,通过Proxy.newProxyInstance创建的代理对象是在jvm运行时动态生成的一个对象,它并不是我们的InvocationHandler类型,也不是我们定义的那组接口的类型,而是在运行是动态生成的一个对象,并且命名方式都是这样的形式,以开头,proxy为中,最后一个数字表示对象的标号。

Java动态代理与静态代理相关推荐

  1. Java设计模式学习06——静态代理与动态代理(转)

    原地址:http://blog.csdn.net/xu__cg/article/details/52970885 一.代理模式 为某个对象提供一个代理,从而控制这个代理的访问.代理类和委托类具有共同的 ...

  2. Java代理模式/静态代理/动态代理

    代理模式:即Proxy Pattern,常用的设计模式之一.代理模式的主要作用是为其他对象提供一种代理以控制对这个对象的访问. 代理概念 :为某个对象提供一个代理,以控制对这个对象的访问. 代理类和委 ...

  3. Java设计模式之代理(动态代理,静态代理)

    代理设计模式,是一种常用的设计模式.顾名思义,在面向对象的世界中,就是一个对象对另一个对象的代理. 如现实生活中,处处都是代理,中介是对业主的代理,王婆是对金莲的代理,经纪人至于艺人的代理,销售代理等 ...

  4. Java中三种代理方式—— 静态代理与两种动态代理的实现机制

    个人博客请访问 http://www.x0100.top 1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现 ...

  5. 第六周 Java语法总结_设计原则_工厂模式_单例模式_代理模式(静态代理_动态代理)_递归_IO流_网络编程(UDP_TCP)_反射_数据库

    文章目录 20.设计原则 1.工厂模式 2.单例模式 1)饿汉式 2)懒汉式 3.Runtime类 4.代理模式 1)静态代理 2)动态代理 动态代理模板 21.递归 22.IO流 1.File 2. ...

  6. java 动态代理与静态代理

    代理在生活中比较常见,比如常见的代理商,对工厂进行代理,工厂专注生产,代理商负责经销,用户购买商品从代理商手中购买.java中代理分为动态代理与静态代理,其中动态代理比较常见的有jdk动态代理和cgl ...

  7. 【Android 插件化】Hook 插件化框架 ( Hook 技术 | 代理模式 | 静态代理 | 动态代理 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  8. 代理模式——静态代理,动态代理(JDK代理和CGLib代理)

    概述 由于某些原因需要给某对象提供一个代理以控制对该对象的访问. 这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介. Java中的代理按照代理类生成时机不同又分为 ...

  9. 红橙Darren视频笔记 代理模式 动态代理和静态代理

    红橙Darren视频笔记 代理模式 动态代理和静态代理(Android API 25) 关于代理模式我之前有过相关的介绍: https://blog.csdn.net/u011109881/artic ...

  10. 浅谈动态代理和静态代理的底层原理及实现

    什么是反射,反射的作用是什么 ​ Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用 ...

最新文章

  1. WPF/Silverlight深度解决方案:(十六)传值实现
  2. 实战SSM_O2O商铺_03项目结构规划及Maven配置
  3. 2018-2019-1 20165318 20165322 20165326 实验一 开发环境的熟悉
  4. REVERSE-PRACTICE-BUUCTF-25
  5. 微信小程序使用函数的方法
  6. Java笔记-对tomcat进一步认识
  7. java mongodb开发_Java Tutorial:Java操作MongoDB入门
  8. SQL Server 占用内存太高,查找占用内存高以及影响其性能的sql语句
  9. iPhone 12还没出,iPhone 13开始了:将采用120Hz ProMotion显示屏
  10. boost asio异步通信
  11. 击鼓传花:对比 muduo 与 libevent2 的事件处理效率
  12. phpwind8.7升级9.0.1过程(三)20130107升级到20130227
  13. lg android tv 手机助手,手机如何投屏到LG电视的教程来了!
  14. 4.2V锂电池充电、放电保护电路分享
  15. Hadoop系列之MapReduce 数据本地化 (29)
  16. 可长期免费使用的国产PLC录波软件(数据采集软件)PLC-Recorder V2.0版新功能
  17. 做量化交易需要了解的国外在线量化平台有哪些?
  18. BZOJ 1123: [POI2008]BLO
  19. Git克隆Github项目学习笔记
  20. 《番茄工作法图解》读书笔记

热门文章

  1. 带UpdatePanel页面返回js问题
  2. Custom.pll : ZOOM小测试
  3. 蔡琴之《祈祷》纪念今日沪指逆境大涨
  4. 由Net Applications的浏览器的市场份额想开的
  5. 设计模式之不简单的工厂模式(二)
  6. python查询mysql数据库_用python操作mysql数据库(之简单查询操作)
  7. CCF 201703-2 学生排队
  8. 2017年国内开源镜像站点汇总 1
  9. 维基解密曝CIA 入侵苹果、安卓机、电视,快来围观8761份泄密文
  10. 使用cisco pt 6.0模拟NAT,PAT