代理模式
一个抽象接口,一个功能类,一个功能类的代理类。代理类组合功能类。功能类和功能类的代理均实现了抽象接口。调用者通过代理类调用实际功能类。
代理分为静态代理和动态代理。动态代理的经典使用:Retrofit
开源库。
1、和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。 2、和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。
应用场景:远程代理(服务器和客户端)、安全代理(安全控制)、虚拟代理、延迟加载、智能指引。
动态代理
动态代理实现流程
自定义一个interface接口。动态代理只能对接口代理,因为代理类是继承了Proxy类的。
自定义Handler
类,扩展实现InvocationHandler
接口,实现invoke
方法。
通过Proxy.newProxyInstance
获得动态代理类实例proxy
。第一个参数是interface的classLoader,第二个参数是interface的class,第三个参数是步骤二的对象实例。
proxy
是实现了interface接口的,即可调用interface的方法。此时调用interface的方法最终是调用到步骤二中InvocationHandler
中的invoke
方法。
动态代理中的角色
interface是代理模式中的抽象接口。
InvocationHandler
是代理模式中的实际功能类(RealClass)的角色。
Proxy.newProxyInstance
函数内部会在JVM内生成代理类,即代理模式中的代理类ProxyClass; 函数返回结果是代理类的一个实例对象,相当于client中的proxyClassObject
。
获取Proxy代理类。
getProxyClass(ClassLoader loader, Class<?>... interfaces)
获取代理类class类型,可以通过这个class类型,反射构造函数,创建实例。
newProxyInstance方法解析
生成代理类。通过getProxyClass0
方法生成代理类。这个函数可以生成一个$Proxy0.class
文件,并且当做代理类加载到JVM中。
通过反射获取代理类构造函数。构造函数的入参是InvocationHandler
。
通过构造函数生成代理类实例。
public static Object newProxyInstance ( ClassLoader loader, Class < ? > [ ] interfaces, InvocationHandler h)
throws IllegalArgumentException
{
Objects . requireNonNull ( h) ;
final Class < ? > [ ] intfs = interfaces. clone ( ) ;
Class < ? > cl = getProxyClass0 ( loader, intfs) ;
try {
final Constructor < ? > cons = cl. getConstructor ( constructorParams) ;
final InvocationHandler ih = h;
if ( ! Modifier . isPublic ( cl. getModifiers ( ) ) ) {
cons. setAccessible ( true ) ;
}
return cons. newInstance ( new Object [ ] {
h} ) ;
} catch ( IllegalAccessException | InstantiationException e) {
throw new InternalError ( e. toString ( ) , e) ;
} catch ( InvocationTargetException e) {
} catch ( NoSuchMethodException e) {
throw new InternalError ( e. toString ( ) , e) ;
}
}
标准JVM虚拟机中getProxyClass0 函数实现
public interface NameInterface {
String getName ( ) ;
}
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 NameInterface {
private static Method m1;
private static Method m3;
private static Method m2;
private static Method m0;
public $Proxy0 ( InvocationHandler paramInvocationHandler) throws {
super ( paramInvocationHandler) ;
}
static {
try {
m1 = Class . forName ( "java.lang.Object" ) . getMethod ( "equals" , new Class [ ] {
Class . forName ( "java.lang.Object" ) } ) ;
m3 = Class . forName ( "NameInterface" ) . getMethod ( "getName" , new Class [ 0 ] ) ;
m2 = Class . forName ( "java.lang.Object" ) . getMethod ( "toString" , new Class [ 0 ] ) ;
m0 = Class . forName ( "java.lang.Object" ) . getMethod ( "hashCode" , new Class [ 0 ] ) ;
return ;
} catch ( NoSuchMethodException localNoSuchMethodException) {
throw new NoSuchMethodError ( localNoSuchMethodException. getMessage ( ) ) ;
} catch ( ClassNotFoundException localClassNotFoundException) {
throw new NoClassDefFoundError ( localClassNotFoundException. getMessage ( ) ) ;
}
}
@Override
public String getName ( ) throws {
try {
return ( String ) this . h. invoke ( this , m3, null ) ;
} catch ( Error | RuntimeException localError) {
throw localError;
} catch ( Throwable localThrowable) {
throw new UndeclaredThrowableException ( localThrowable) ;
}
}
}
Android虚拟机中getProxyClass0 函数实现
核心实现:生成动态class类的核心实现是Proxy.ProxyClassFactory#apply
方法。调用native方法 Proxy#generateProxy
,生成代理类。
private static final class ProxyClassFactory implements BiFunction < ClassLoader , Class < ? > [ ] , Class < ? > >
{
private static final String proxyClassNamePrefix = "$Proxy" ;
private static final AtomicLong nextUniqueNumber = new AtomicLong ( ) ;
@Override
public Class < ? > apply ( ClassLoader loader, Class < ? > [ ] interfaces) {
{
List < Method > methods = getMethods ( interfaces) ;
Collections . sort ( methods, ORDER_BY_SIGNATURE_AND_SUBTYPE) ;
validateReturnTypes ( methods) ;
List < Class < ? > [ ] > exceptions = deduplicateAndGetExceptions ( methods) ;
Method [ ] methodsArray = methods. toArray ( new Method [ methods. size ( ) ] ) ;
Class < ? > [ ] [ ] exceptionsArray = exceptions. toArray ( new Class < ? > [ exceptions. size ( ) ] [ ] ) ;
long num = nextUniqueNumber. getAndIncrement ( ) ;
String proxyName = proxyPkg + proxyClassNamePrefix + num;
return generateProxy ( proxyName, interfaces, loader, methodsArray, exceptionsArray) ;
}
}
}
函数流程:Proxy#getProxyClass0
-> WeakCache#get
-> WeakCache.Factory#Factory
-> WeakCache.Factory#get
-> Proxy.ProxyClassFactory#apply
-> Proxy#generateProxy
-> native方法Proxy_generateProxy
WeakCache#subKeyFactory
类型是Proxy.KeyFactory
;WeakCache#valueFactory
类型是Proxy.ProxyClassFactory
; WeakCache.Factory
继承了function.Supplier
;
private static final WeakCache < ClassLoader , Class < ? > [ ] , Class < ? > >
proxyClassCache = new WeakCache < > ( new KeyFactory ( ) , new ProxyClassFactory ( ) ) ;
generateProxy
native实现Android系统源码:art/runtime/native/java_lang_reflect_Proxy.cc
static jclass Proxy_generateProxy ( JNIEnv* env, jclass, jstring name, jobjectArray interfaces,
jobject loader, jobjectArray methods, jobjectArray throws) {
ScopedFastNativeObjectAccess soa ( env) ;
ClassLinker* class_linker = Runtime:: Current ( ) -> GetClassLinker ( ) ;
return soa. AddLocalReference< jclass> ( class_linker-> CreateProxyClass (
soa, name, interfaces, loader, methods, throws) ) ;
}
static JNINativeMethod gMethods[ ] = {
FAST_NATIVE_METHOD ( Proxy, generateProxy, "(Ljava/lang/String;[Ljava/lang/Class;Ljava/lang/ClassLoader;[Ljava/lang/reflect/Method;[[Ljava/lang/Class;)Ljava/lang/Class;" ) ,
} ;
void register_java_lang_reflect_Proxy ( JNIEnv* env) {
REGISTER_NATIVE_METHODS ( "java/lang/reflect/Proxy" ) ;
}
art/runtime/class_linker.cc 源码文件中定义了ClassLinker::CreateProxyClass
,此方法是Android生成class代理类的核心方法。
mirror:: Class* ClassLinker:: CreateProxyClass ( ScopedObjectAccessAlreadyRunnable& soa,
jstring name,
jobjectArray interfaces,
jobject loader,
jobjectArray methods,
jobjectArray throws)