代理模式

静态代理,动态代理 :接口代理【jdk代理】,cglib代理

具体使用可参考:http://www.cnblogs.com/cenyu/p/6289209.html#autoid-1-1-0

 代理原理:http://www.360doc.com/content/14/0801/14/1073512_398598312.shtml

 动态代理调用原理:http://blog.csdn.net/wang_1997/article/details/52450549

反射打印:http://blog.csdn.net/rokii/article/details/4046098

 

静态代理需要实现被代理类实现的解口

动态代理需要实现InvocationHandler接口

cglib代理需要实现MethodIntercept解口

静态代理和动态代理:需要被代理类实现接口。

cglib代理:被代理的类可以是个普通的类,不需要实现接口。

 

动态代理:

在运行过程生成代理二进制文件Proxy0,加载class,改class含有对动态代理类(InvocationHandler)的引用,以调用其invoke方法。

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.lang.reflect.UndeclaredThrowableException;
import main.designer.proxy.justtest.IUser;

public final class $Proxy0
extends Proxy
implements IUser
{
private static Method m1;
private static Method m0;
private static Method m3;
private static Method m2;

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

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

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

public final void showSkill()
throws
{
try
{
this.h.invoke(this, m3, null);
return;
}
catch (Error|RuntimeException localError)
{
throw localError;
}
catch (Throwable localThrowable)
{
throw new UndeclaredThrowableException(localThrowable);
}
}

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

static
{
try
{
m1 = Class.forName("java.lang.Object").getMethod("equals", new Class[] { Class.forName("java.lang.Object") });
m0 = Class.forName("java.lang.Object").getMethod("hashCode", new Class[0]);
m3 = Class.forName("main.designer.proxy.justtest.IUser").getMethod("showSkill", new Class[0]);
m2 = Class.forName("java.lang.Object").getMethod("toString", new Class[0]);
return;
}
catch (NoSuchMethodException localNoSuchMethodException)
{
throw new NoSuchMethodError(localNoSuchMethodException.getMessage());
}
catch (ClassNotFoundException localClassNotFoundException)
{
throw new NoClassDefFoundError(localClassNotFoundException.getMessage());
}
}
}

CGLib创建的动态代理对象性能比JDK创建的动态代理对象的性能高不少,但是CGLib在创建代理对象时所花费的时间却比JDK多得多,所以对于单例的对象,因为无需频繁创建对象,用CGLib合适,反之,使用JDK方式要更为合适一些。同时,由于CGLib由于是采用动态创建子类的方法,对于final方法,无法进行代理

posted on 2017-07-12 10:45  小付瓜  阅读(101)  评论(0)    收藏  举报