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

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

  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. 用qsort排序

     冒泡,快排都是常见的排序方法,这里介绍用头文件里的qsort函数排序.只是自己要先一个cmp函数. #include<stdlib.h>//qsort的头文件 int a[100]= ...

  2. cocos2d 走动椭圆

    1.效果图 艺术与规划说他想与我合作在全国率先主角光环加,椭圆形走动. cocos2d自带没有,參考网上的写了一个. 2.椭圆数学知识 有关椭圆的数学知识我已经忘光了.网上找了点资料: a是椭圆的长半 ...

  3. VSTO学习笔记(五)批量编辑Excel 2010 x64

    原文:VSTO学习笔记(五)批量编辑Excel 2010 x64 近期因为工作的需要,经常要批量处理大量的Excel文件,如果纯手工一个个修改,非常的麻烦,于是写了这么一个帮助类,希望能对你有所帮助. ...

  4. 【WinRT】【译】【加工】在 XAML 中制作圆形图片

    原文:[WinRT][译][加工]在 XAML 中制作圆形图片 原文地址:http://timheuer.com/blog/archive/2015/05/06/making-circular-ima ...

  5. Delphi 基本数据类型列表 高级数据类型列表 字符类型查询列表清单

    原文:Delphi 基本数据类型列表 高级数据类型列表 字符类型查询列表清单 长长的列表文字类型文件 分类 范围 字节 备注 简单类型 序数 整数 Integer -2147483648 .. 214 ...

  6. POj 1879 Tempus et mobilius Time and motion (模拟+群)

    题目特别长,大意为球的传递. 三个轨道,一个库.各自是分钟单位的轨道.5min单位的轨道.一小时单位的轨道.还有就是n容量的库. 每过一分钟,一个小球从库里面出来,库符合先进先出,进入分钟轨道.假设分 ...

  7. Codeforces Round #296 (Div. 1) E. Triangles 3000

    http://codeforces.com/contest/528/problem/E 先来吐槽一下,一直没机会进div 1, 马力不如当年, 这场题目都不是非常难,div 2 四道题都是水题! 题目 ...

  8. JAVA实现Shell排序

    Shell排序可以理解为插入排序的变种,它充分利用了插入排序的两个特点: (1). 当数据规模小的时候非常高效. (2). 当给定数据已经有序时的时间代价为O(N) 所以,Shell排序每次把数据分成 ...

  9. dblink如果很慢可以用这种方式优化

    发现dblink如果很慢可以用这种方式加个/*+driving_site(xxx)*/,查询很快 DBLINK HINT /*+ driving_site(org) */ 优化策略和思路 使用DBLI ...

  10. 关于在ios7之后改变状态栏颜色

    看到网上都说 在ios7之后要这样设置 首先,须要在Info.plist配置文件里,添加键:UIViewControllerBasedStatusBarAppearance,并设置为YES: 然后,在 ...