Java中动态代理技术生成的类与原始类的区别 (good)
用动态代理的时候,对它新生成的类长什么样子感到好奇.有幸通过一些资料消除了心里的疑惑.
平时工作使用的Spring框架里面有一个AOP(面向切面)的机制,只知道它是把类重新生成了一遍,在切面上加上了后来定义的逻辑.这样就达到了动态的在原有类上增加一些功能.比如日志打印,拦截信息等.
这里只关心动态代理技术生成新的类,先不管虚拟机是如何去生成类,用了什么字节码生成技术,怎么产生字节码等这一系列动作.现在只关心最后生成的新类长什么样,它和老类有什么区别.为了获取到生成后的代理类的字节码并且反编译成我们能够看得懂的代码,需要实现一个动态代理例子.
例子
//接口
package note.com; public interface IGirl {
void sayHello();
}
//接口实现,也是需要利用动态代理扩展功能的类
package note.com; public class MyGirl implements IGirl {
public void sayHello() {
System.out.println("如花似玉石榴姐");
}
}
//代理实现类
package note.com; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; public class ProxyGirl implements InvocationHandler {
Object originalObj; Object bind(Object originalObj) {
this.originalObj = originalObj;
return Proxy.newProxyInstance(originalObj.getClass()
.getClassLoader(), originalObj.getClass().getInterfaces(),
this);
} public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("第一美女是:");
return method.invoke(originalObj, args);
}
}
//测试类
package note.com; public class Test { public static void main(String[] args) {
IGirl hello = (IGirl) new ProxyGirl().bind(new MyGirl());
hello.sayHello();
System.out.println(hello.getClass().getName());
} }
结果:
第一美女是:
如花似玉石榴姐
com.sun.proxy.$Proxy0
这里可见hello真实类型是$Proxy0,到底它长什么样子,往下看.
代理类字节码反编译结果
package note.com; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.lang.reflect.UndeclaredThrowableException; /**
* 动态生成的类字节码的反编译结果
*
*/
public final class $Proxy0 extends Proxy implements IGirl { private static Method m3;
private static Method m1;
private static Method m0;
private static Method m2; /*
* 构造函数传入能够访问真实对象的代理类,这个实际是上例Test中的new ProxyGirl()
*/
protected $Proxy0(InvocationHandler h) {
super(h);
} /*
* 代理实现sayHello,
*/
public void sayHello() {
try {
this.h.invoke(this, m3, null);
} catch (RuntimeException localRuntimeException) {
throw localRuntimeException;
} catch (Throwable localThrowable) {
throw new UndeclaredThrowableException(localThrowable);
} } /*
* 代理实现继承自Object的equals
*/
public void equals() {
try {
this.h.invoke(this, m1, null);
} catch (RuntimeException localRuntimeException) {
throw localRuntimeException;
} catch (Throwable localThrowable) {
throw new UndeclaredThrowableException(localThrowable);
}
} /*
* 代理实现继承自Object的hashCode
*/
public int hashCode() {
try {
return (Integer) this.h.invoke(this, m0, null);
} catch (RuntimeException localRuntimeException) {
throw localRuntimeException;
} catch (Throwable localThrowable) {
throw new UndeclaredThrowableException(localThrowable);
}
} /*
* 代理实现继承自Object的toString
*/
public String toString() {
try {
return (String) this.h.invoke(this, m2, null);
} catch (RuntimeException localRuntimeException) {
throw localRuntimeException;
} catch (Throwable localThrowable) {
throw new UndeclaredThrowableException(localThrowable);
}
} /*
* 初始化真实对象中的所有方法
*/
static {
try {
m3 = Class.forName("note.com.IGirl").getMethod("sayHello",
new Class[0]);
m1 = Class.forName("java.lang.Object").getMethod("equals",
new Class[] { Class.forName("java.lang.Object") });
m0 = Class.forName("java.lang.Object").getMethod("equals",
new Class[0]);
m2 = Class.forName("java.lang.Object").getMethod("equals",
new Class[0]);
} catch (NoSuchMethodException localNoSuchMethodException) {
throw new NoSuchMethodError(localNoSuchMethodException.getMessage());
} catch (ClassNotFoundException localClassNotFoundException) {
throw new NoClassDefFoundError(
localClassNotFoundException.getMessage());
}
} }
通过观察反编译后的动态类,这个逻辑并不复杂,主要功能是对所有的方法进行初始化,到执行某个方法的时候调用我们自己实现的代理类去执行扩展功能和原始类的方法.
对原始类和动态代理后产生的类进行比较:
1,$Proxy0访问真实的类对象通过InvocationHandler的实现类调用.
2,动态代理扩展功能并没有在$Proxy0中加入,而是回调InvocationHandler的接口,通过子类实现Invoke方法扩展.
从调用关系上看使用动态代理前后:
aaarticlea/png;base64,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" alt="" />
左边:是原始的调用关系,原始类中有什么逻辑就执行什么.
右边:是动态代理以后,通过动态代理生成类的对象调用代理类,代理类调用扩展逻辑,然后调用原始类对象的逻辑.由此实现了对原始类的动态扩展.
通过这样追本溯源的去了解,我对动态代理的理解更加深刻,也打消了心里的一个疑惑.
ps:
动态代理什么时候用?可以参考这个:动态代理技术实现设计模式-代理模式
文中的字节码反编译是参考<<深入理解Java虚拟机 JVM高级特性与最佳实践>>这本书.
http://www.cnblogs.com/qinggege/p/5288182.html
Java中动态代理技术生成的类与原始类的区别 (good)的更多相关文章
- Java中动态代理技术生成的类与原始类的区别 (转)
用动态代理的时候,对它新生成的类长什么样子感到好奇.有幸通过一些资料消除了心里的疑惑. 平时工作使用的Spring框架里面有一个AOP(面向切面)的机制,只知道它是把类重新生成了一遍,在切面上加上了后 ...
- Java中动态代理技术生成的类与原始类的区别
用动态代理的时候,对它新生成的类长什么样子感到好奇.有幸通过一些资料消除了心里的疑惑. 平时工作使用的Spring框架里面有一个AOP(面向切面)的机制,只知道它是把类重新生成了一遍,在切面上加上了后 ...
- JAVA中的代理技术(静态代理和动态代理)
最近看书,有两个地方提到了动态代理,一是在Head First中的代理模式,二是Spring AOP中的AOP.所以有必要补充一下动态代理的相关知识. Spring采用JDK动态代理和CGLib动态代 ...
- 代理模式 & Java原生动态代理技术 & CGLib动态代理技术
第一部分.代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常 ...
- java中动态代理实现机制
前言: 代理模式是常用的java设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系 ...
- java中动态代理
一.在java中怎样实现动态代理 1.我们要有一个接口,还要有一个接口的实现类,而这个实现类呢就是我们要代理的对象 接口: package org.dynamicproxy.test; public ...
- java中动态代理的实现
动态代理的实现 使用的模式:代理模式. 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问.类似租房的中介. 两种动态代理: (1)jdk动态代理,jdk动态代理是由Java内部的反射机制 ...
- Java中动态代理方式:
JDK中生成代理对象的API 代理类所在包:java.lang.reflect.ProxyJDK实现代理只需要使用newProxyInstance方法,但是该方法需要接收三个参数,完整的写法是: st ...
- Java中动态代理实现原理深究
一.前言 笔者平时开发使用“动态代理”不多,最近在看设计模式的时候,“动态代理”又在面前晃了几次,所以这次想从源码的角度去分析动态代理的实现原理,以窥探其精妙~ 二.正文 2.1 静态代理 本文源码 ...
随机推荐
- 【u027】神秘大三角
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 判断一个点与已知三角形的位置关系. [输入格式] 前三行:每行一个坐标,表示该三角形的三个顶点 第四行 ...
- GTID的限制
1.不支持非事务引擎(从库报错,stop slave;start slave;忽略). 2.不支持create table ... select 语句复制(主库直接报错). 3.不允许一个SQL同时更 ...
- log4erl Configuration
https://github.com/ahmednawras/log4erl/blob/master/CONFIGURATION.txt Configuration Guide: ========== ...
- Expression Blend 的点滴(4)--创建类似iPhone屏幕锁控件(下)
原文:Expression Blend 的点滴(4)--创建类似iPhone屏幕锁控件(下) 接着上篇... 接下去,将一步步演示如果创建当点击checkBox后,其中的按钮由左边滑动到右边,表示处于 ...
- 【u226】查单词
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 全国英语四级考试就这样如期到来了.可是小Y依然没有做好充分的准备.为了能够大学毕业,可怜的小Y决定作弊 ...
- 解决离线Could not parse configuration:hibernate.cfg.xml错误
离线使用hibernate tool 生成反向工程,在配置 配置文件完,生成配置文件后,会报出org.hibernate.HibernateException: Could not parse con ...
- Qt多线程和GUI界面假死(run()是线程的入口,就像main()对于应用程序的作用。分析QThread::exec函数的源码,旧的QMutexLocker模式其实很好用,挡住别人进入抢占资源,可照抄)good
QThread的常见特性: run()是线程的入口,就像main()对于应用程序的作用.QThread中对run()的默认实现调用了exec(),从而创建一个QEventLoop对象,由其处理该线程事 ...
- Mapreduce 订单分组案例
程序执行流程如下: map()-->getPartition()分区--->write()(序列化,每一行都顺序执行这三个方法)--->readFields()---->com ...
- 利用WPF建立自己的3d gis软件(非axhost方式)(一)
原文:利用WPF建立自己的3d gis软件(非axhost方式)(一) 先下载SDK:https://pan.baidu.com/s/1M9kBS6ouUwLfrt0zV0bPew 密码:1te1 地 ...
- ThoughtWorks、Teambition、Trello、Slack、DevCloud 主流敏捷软件开发工具平台比较
在大公司做了6年程序员,2年项目经理的小王,正在创业公司迎来他焦虑的而立之年. 但是对于3个月前加入创业公司的决定,他现在有些烦躁和怀疑人生.在他过往的经验看来,公司新接的小项目,在过去的大公司里1个 ...