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

时间:2021-06-12 16:47:08

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

  平时工作使用的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