用动态代理的时候,对它新生成的类长什么样子感到好奇.有幸通过一些资料消除了心里的疑惑.

  平时工作使用的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中动态代理技术生成的类与原始类的区别 (转)的更多相关文章

  1. Java中动态代理技术生成的类与原始类的区别

    用动态代理的时候,对它新生成的类长什么样子感到好奇.有幸通过一些资料消除了心里的疑惑. 平时工作使用的Spring框架里面有一个AOP(面向切面)的机制,只知道它是把类重新生成了一遍,在切面上加上了后 ...

  2. Java中动态代理技术生成的类与原始类的区别 (good)

    用动态代理的时候,对它新生成的类长什么样子感到好奇.有幸通过一些资料消除了心里的疑惑. 平时工作使用的Spring框架里面有一个AOP(面向切面)的机制,只知道它是把类重新生成了一遍,在切面上加上了后 ...

  3. JAVA中的代理技术(静态代理和动态代理)

    最近看书,有两个地方提到了动态代理,一是在Head First中的代理模式,二是Spring AOP中的AOP.所以有必要补充一下动态代理的相关知识. Spring采用JDK动态代理和CGLib动态代 ...

  4. 代理模式 & Java原生动态代理技术 & CGLib动态代理技术

    第一部分.代理模式  代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常 ...

  5. java中动态代理实现机制

    前言: 代理模式是常用的java设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系 ...

  6. java中动态代理

    一.在java中怎样实现动态代理 1.我们要有一个接口,还要有一个接口的实现类,而这个实现类呢就是我们要代理的对象 接口: package org.dynamicproxy.test; public ...

  7. java中动态代理的实现

    动态代理的实现 使用的模式:代理模式. 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问.类似租房的中介. 两种动态代理: (1)jdk动态代理,jdk动态代理是由Java内部的反射机制 ...

  8. Java中动态代理方式:

    JDK中生成代理对象的API 代理类所在包:java.lang.reflect.ProxyJDK实现代理只需要使用newProxyInstance方法,但是该方法需要接收三个参数,完整的写法是: st ...

  9. Java中动态代理实现原理深究

    一.前言 笔者平时开发使用“动态代理”不多,最近在看设计模式的时候,“动态代理”又在面前晃了几次,所以这次想从源码的角度去分析动态代理的实现原理,以窥探其精妙~ 二.正文 2.1 静态代理  本文源码 ...

随机推荐

  1. OpenCV在矩阵上的卷积

    转载请注明出处!!!http://blog.csdn.net/zhonghuan1992 OpenCV在矩阵上的卷积 在openCV官网上说是戴面具,事实上就是又一次计算一下矩阵中的每个value,那 ...

  2. Swift - 微调器或叫步进器(UIStepper)的用法

    1,微调器(UIStepper)控件包含两个按钮“+”和“-”,让使用者可以依照自己的喜欢做数值上的调整. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 1 ...

  3. QML中多样化的ListModel(MultiDelegate)

    在QML的官方例子里面, 基本上都是一样的Delegate, 也就是说不管数据怎样, 样式都是不变的. 如果我们想要根据不同的数据类型来显示不同的UI该怎么办? 这里有一个例子. DataBank L ...

  4. 一个网友写的栈,问为啥不能迭代。具有__iter__ 和next方法的对象叫迭代器-七七巴巴黄页网

    一个网友写的栈,问为啥不能迭代.具有__iter__ 和next方法的对象叫迭代器-七七巴巴黄页网 一个网友写的栈,问为啥不能迭代.具有__iter__ 和next方法的对象叫迭代器 python视频 ...

  5. 从Hadoop骨架MapReduce在海量数据处理模式(包括淘宝技术架构)

    从hadoop框架与MapReduce模式中谈海量数据处理 前言 几周前,当我最初听到,以致后来初次接触Hadoop与MapReduce这两个东西,我便稍显兴奋,认为它们非常是神奇.而神奇的东西常能勾 ...

  6. 看来IT技术与军事技术都是相通的——都是对新事物极为敏感的领域

    这是读到这段时候的感想: 和海军中那些狂热的相信“皇军不可战胜”的大舰巨炮主义者们不同,山口对于与美国开战的主张是持坚定的反对态度的,和山本五十六都做过日本驻美武官的山口都认为一旦与美开战,日本或许能 ...

  7. 小心LinkedHashMap的get()方法(转)

    这是一个来自实际项目的例子,在这个案例中,有同事基于jdk中的LinkedHashMap设计了一个LRUCache,为了提高性能,使用了 ReentrantReadWriteLock 读写锁:写锁对应 ...

  8. UVALive 6869(后缀数组)

    传送门:Repeated Substrings 题意:给定一个字符串,求至少重复一次的不同子串个数. 分析:模拟写出子符串后缀并排好序可以发现,每次出现新的重复子串个数都是由现在的height值减去前 ...

  9. Virtualbox mouse move in and out and file share with windows

    How to use Virstalbox to share files with Linux and Windows, and to move the mouse in and out Virtua ...

  10. Iterator 和 Iterable 差别和联系

    用Iterator模式实现遍历集合  Iterator模式是用于遍历集合类的标准訪问方法.它能够把訪问逻辑从不同类型的集合类中抽象出来,从而避免向client暴露集合的内部结构. 比如,假设没有使用I ...