Java动态代理与静态代理
https://blog.csdn.net/mulinsen77/article/details/84730087
https://www.cnblogs.com/cC-Zhou/p/9525638.html
AOP的原理就是动态代理机制。RPC框架也是实现了AOP机制。
静态代理:由程序员创建或工具生成代理类的源码,再编译代理类,即代理类和委托类的关系再程序运行前就已经存在。
动态代理:在运行期间使用动态生成字节码形式,动态创建代理类。使用的工具有 jdkproxy、cglibproxy 等。
静态代理
/*** 静态代理,这个代理类也必须要实现和被代理类相同的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)。
动态代理模式主要由四个元素共同组成:
1.接口:定义具体实现的方法
2.被代理类:实现上述接口,执行接口中的方法
3.代理类:实现InvocationHandler,帮助被代理类实现方法。
- 因为动态代理不知道被代理的类是哪一个,所以在实现了InvocationHandler的代理类中定义了一个Object类,在代理类的构函数中作为参数传递进来。
- 实现InvocationHandler中的invoke方法。
- 写main方法,并在main方法中根据定义的被代理类实现代理类的生成。
/*** 动态代理类* @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所创建的代理类
我们在代码中加入上述代码,代码就会保存生成的代理类,名称为$Proxy0.class
Java动态代理与静态代理相关推荐
- Java设计模式学习06——静态代理与动态代理(转)
原地址:http://blog.csdn.net/xu__cg/article/details/52970885 一.代理模式 为某个对象提供一个代理,从而控制这个代理的访问.代理类和委托类具有共同的 ...
- Java代理模式/静态代理/动态代理
代理模式:即Proxy Pattern,常用的设计模式之一.代理模式的主要作用是为其他对象提供一种代理以控制对这个对象的访问. 代理概念 :为某个对象提供一个代理,以控制对这个对象的访问. 代理类和委 ...
- Java设计模式之代理(动态代理,静态代理)
代理设计模式,是一种常用的设计模式.顾名思义,在面向对象的世界中,就是一个对象对另一个对象的代理. 如现实生活中,处处都是代理,中介是对业主的代理,王婆是对金莲的代理,经纪人至于艺人的代理,销售代理等 ...
- Java中三种代理方式—— 静态代理与两种动态代理的实现机制
个人博客请访问 http://www.x0100.top 1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现 ...
- 第六周 Java语法总结_设计原则_工厂模式_单例模式_代理模式(静态代理_动态代理)_递归_IO流_网络编程(UDP_TCP)_反射_数据库
文章目录 20.设计原则 1.工厂模式 2.单例模式 1)饿汉式 2)懒汉式 3.Runtime类 4.代理模式 1)静态代理 2)动态代理 动态代理模板 21.递归 22.IO流 1.File 2. ...
- java 动态代理与静态代理
代理在生活中比较常见,比如常见的代理商,对工厂进行代理,工厂专注生产,代理商负责经销,用户购买商品从代理商手中购买.java中代理分为动态代理与静态代理,其中动态代理比较常见的有jdk动态代理和cgl ...
- 【Android 插件化】Hook 插件化框架 ( Hook 技术 | 代理模式 | 静态代理 | 动态代理 )
Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...
- 代理模式——静态代理,动态代理(JDK代理和CGLib代理)
概述 由于某些原因需要给某对象提供一个代理以控制对该对象的访问. 这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介. Java中的代理按照代理类生成时机不同又分为 ...
- 红橙Darren视频笔记 代理模式 动态代理和静态代理
红橙Darren视频笔记 代理模式 动态代理和静态代理(Android API 25) 关于代理模式我之前有过相关的介绍: https://blog.csdn.net/u011109881/artic ...
- 浅谈动态代理和静态代理的底层原理及实现
什么是反射,反射的作用是什么 Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用 ...
最新文章
- WPF/Silverlight深度解决方案:(十六)传值实现
- 实战SSM_O2O商铺_03项目结构规划及Maven配置
- 2018-2019-1 20165318 20165322 20165326 实验一 开发环境的熟悉
- REVERSE-PRACTICE-BUUCTF-25
- 微信小程序使用函数的方法
- Java笔记-对tomcat进一步认识
- java mongodb开发_Java Tutorial:Java操作MongoDB入门
- SQL Server 占用内存太高,查找占用内存高以及影响其性能的sql语句
- iPhone 12还没出,iPhone 13开始了:将采用120Hz ProMotion显示屏
- boost asio异步通信
- 击鼓传花:对比 muduo 与 libevent2 的事件处理效率
- phpwind8.7升级9.0.1过程(三)20130107升级到20130227
- lg android tv 手机助手,手机如何投屏到LG电视的教程来了!
- 4.2V锂电池充电、放电保护电路分享
- Hadoop系列之MapReduce 数据本地化 (29)
- 可长期免费使用的国产PLC录波软件(数据采集软件)PLC-Recorder V2.0版新功能
- 做量化交易需要了解的国外在线量化平台有哪些?
- BZOJ 1123: [POI2008]BLO
- Git克隆Github项目学习笔记
- 《番茄工作法图解》读书笔记