设为首页 加入收藏

TOP

Java动态代理深入解析(五)
2017-02-08 08:16:41 】 浏览:373
Tags:Java 动态 代理 深入 解析
ds Proxy
? implements Test.Subject
{
? private static Method m4;
? private static Method m1;
? private static Method m3;
? private static Method m0;
? private static Method m2;
?
? static
? {
? ? ? try {
? ? ? ? ? m4 = Class.forName("Test$Subject").getMethod("sayHello", new Class[0]);
? ? ? ? ? m1 = Class.forName("java.lang.Object").getMethod("equals", new Class[] { Class.forName("java.lang.Object") });
? ? ? ? ? m3 = Class.forName("Test$Subject").getMethod("sayHi", new Class[0]);
? ? ? ? ? m0 = Class.forName("java.lang.Object").getMethod("hashCode", new Class[0]);
? ? ? ? ? m2 = Class.forName("java.lang.Object").getMethod("toString", new Class[0]);
? ? } catch (Exception e) {
? ? ? ? throw new RuntimeException(e);
? ? }
? }


? public $Proxy0(InvocationHandler paramInvocationHandler)
? {
? ? super(paramInvocationHandler);
? }


? public final void sayHello()
? {
? ? try
? ? {
? ? ? this.h.invoke(this, m4, null);
? ? ? return;
? ? }
? ? catch (RuntimeException localRuntimeException)
? ? {
? ? ? throw localRuntimeException;
? ? }
? ? catch (Throwable localThrowable)
? ? {
? ? ? ? throw new UndeclaredThrowableException(localThrowable);
? ? }
? }


? public final boolean equals(Object paramObject)
? {
? ? try
? ? {
? ? ? return ((Boolean)this.h.invoke(this, m1, new Object[] { paramObject })).booleanValue();
? ? }
? ? catch (RuntimeException localRuntimeException)
? ? {
? ? ? throw localRuntimeException;
? ? }
? ? catch (Throwable localThrowable)
? ? {
? ? ? ? throw new UndeclaredThrowableException(localThrowable);
? ? }
? }


? public final void sayHi()
? {
? ? try
? ? {
? ? ? this.h.invoke(this, m3, null);
? ? ? return;
? ? }
? ? catch (RuntimeException localRuntimeException)
? ? {
? ? ? throw localRuntimeException;
? ? }
? ? catch (Throwable localThrowable)
? ? {
? ? ? ? throw new UndeclaredThrowableException(localThrowable);
? ? }
? }


? public final int hashCode()
? {
? ? try
? ? {
? ? ? return ((Integer)this.h.invoke(this, m0, null)).intValue();
? ? }
? ? catch (RuntimeException localRuntimeException)
? ? {
? ? ? throw localRuntimeException;
? ? }
? ? catch (Throwable localThrowable)
? ? {
? ? ? ? throw new UndeclaredThrowableException(localThrowable);
? ? }
? }


? public final String toString()
? {
? ? try
? ? {
? ? ? return (String)this.h.invoke(this, m2, null);
? ? }
? ? catch (RuntimeException localRuntimeException)
? ? {
? ? ? throw localRuntimeException;
? ? }
? ? catch (Throwable localThrowable)
? ? {
? ? ? ? throw new UndeclaredThrowableException(localThrowable);
? ? }
? }
}


我们可以看到代理类内部实现比较简单,在调用每个代理类每个方法的时候,都用反射去调h的invoke方法(也就是我们自定义的InvocationHandler的子类中重写的invoke方法),用参数传递了代理类实例、接口方法、调用参数列表,这样我们在重写的invoke方法中就可以实现对所有方法的统一包装了。


总结:


动态代理相对于静态代理在使用上的优点主要是能够对一个对象的所有方法进行统一包装,而且后期被代理的类添加方法的时候动态代理类不需要改动。


缺点是要求被代理的类必须实现了接口,因为动态代理类在实现的时候继承了Proxy类,java不支持多继承,因此动态代理类只能根据接口来定义方法。


最后动态代理之所以叫做动态代理是因为java在实现动态代理的时候,动态代理类是在运行时动态生成和加载的,相对的,静态代理类和其他普通类一下,在类加载阶段就加载了。


首页 上一页 2 3 4 5 下一页 尾页 5/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇从JVM的角度来看单例模式 下一篇Java虚拟机字节码执行引擎

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目