Java中动态代理技术生成的类与原始类的区别
用动态代理的时候,对它新生成的类长什么样子感到好奇.有幸通过一些资料消除了心里的疑惑.
平时工作使用的Spring框架里面有一个AOP(面向切面)的机制,只知道它是把类重新生成了一遍,在切面上加上了后来定义的逻辑.这样就达到了动态的在原有类上增加一些功能.比如日志打印,拦截信息等.
这里只关心动态代理技术生成新的类,先不管虚拟机是如何去生成类,用了什么字节码生成技术,怎么产生字节码等这一系列动作.现在只关心最后生成的新类长什么样,它和老类有什么区别.为了获取到生成后的代理类的字节码并且反编译成我们能够看得懂的代码,需要实现一个动态代理例子.
例子
//接口
package note.com; /**
* Girl接口
* @author lxz
*
*/
public interface IGirl {
void sayHello();
}
//接口实现,也是需要利用动态代理扩展功能的类
package note.com; /**
* 具体Girl
* @author lxz
*
*/
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; /**
* 代理类
* 功能:给IGirl实现类增加介绍
* @author lxz
*
*/
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; /**
* 测试类
*
* @author lxz
*
*/
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高级特性与最佳实践>>这本书.
Java中动态代理技术生成的类与原始类的区别的更多相关文章
- Java中动态代理技术生成的类与原始类的区别 (转)
用动态代理的时候,对它新生成的类长什么样子感到好奇.有幸通过一些资料消除了心里的疑惑. 平时工作使用的Spring框架里面有一个AOP(面向切面)的机制,只知道它是把类重新生成了一遍,在切面上加上了后 ...
- Java中动态代理技术生成的类与原始类的区别 (good)
用动态代理的时候,对它新生成的类长什么样子感到好奇.有幸通过一些资料消除了心里的疑惑. 平时工作使用的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 静态代理 本文源码 ...
随机推荐
- 小侃#pragma
#pragma是一个编译器指令. ================================================================ #pragma comment(li ...
- ipsec vpn私网数据大量掉包问题
周四出现了一个很奇葩的问题,所有的站点的VPN通信都是正常的,唯独郑州节点和中心节点的私网数据长ping掉包量达到20%左右,在中心节点ping郑州节点公网IP没有发现掉包问题,故障排除如下: 1.测 ...
- Application to find the maximum temperature in the weather dataset
import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop. ...
- 通过Camera进行拍照
Android通过Camera来控制拍照,使用Camera比较简单,按步骤进行即可: 下面用一个示例来演示: Activity: package com.home.activity; import j ...
- 解析汽车B2C商城网站四种盈利模式
汽车已成为家庭的日常用品,汽车的配套设施也成为销售的热点,汽车B2C电子商城为行业营销的新平台,汽车B2C电子商务网站盈利的模式是怎样的?创新的盈利模式才能在行业竞争中生存. 资讯产品一体模式 网站的 ...
- AntiXSS - 支持Html同时防止XSS攻击
AntiXSS - 支持Html同时防止XSS攻击 跨站脚本攻击(XSS)已经不是什么新鲜的话题了,甚至很多大公司也为此吃尽苦头.最简单直接的防范方法,就是不允许任何html标签输入,对用户输入进行编 ...
- 第27本:《学得少却考得好Learn More Study Less》
第27本:<学得少却考得好Learn More Study Less> <学得少却考得好Learn More Study Less>这本书最早是从褪墨网站上看到的,crownc ...
- SESC中的热量模拟器
SESC安装见前文 配置sesc支持热量模拟 ../sesc/configure --enable-power --enable-therm make 遇到问题: 1 找不到 liblevmar.a ...
- 【PLSQL】绑定变量,活跃SQL,软硬解析解析
************************************************************************ ****原文:blog.csdn.net/clar ...
- java的提取与替换操作
public class Demo02 { public static void main(String args[]){ String str = "java 技术学习班 2007032 ...