代理模式

2016-04-23  本文已影响111人  cxm11

Android插件化原理解析——Hook机制之动态代理

Android插件化原理解析——概要

Retrofit2 动态代理下的分析


代理是什么

代理是一种设计模式,分为静态代理和动态代理。

没有代理前,调用是这样的:

调用后,它们的调用顺序是这样的:

通过在中间加了一层代理,将业务逻辑与实现细节分层,方便了上层开发者。

代理可以实现方法增强,比如常用的日志、缓存等;也可以实现方法拦截,通过代理方法修改原方法的参数和返回值。


静态代理

通过用户手动编码或者在编译时自动生成。

在APPCompatActivity中的APPCompatDelegate抽象类就是静态代理,而抽象类的具体实例化是在静态语句块static{}区中根据版本号实现的,这样写可以避免 Activity 本身的业务过于冗余,同时将抽象类(也可能是接口)与实现类相分离,这样上层开发者可以专注于业务,而不用管具体的实现。

动态代理

动态代理是java中的字节码生成技术。通过接口生成代理类,并将代理类的实现交给InvocationHandler作为具体的实现。

传统的静态代理模式需要为每一个需要代理的类写一个代理类,如果需要代理的类有几百个那不是要累死?为了更优雅地实现代理模式,JDK提供了动态代理方式。

动态代理主要处理InvocationHandler和Proxy类。

AppCompatDelegateImplBase extends AppCompatDelegate

AppCompatDelegate
{
AppCompatDelegateImplBase
}

AppCompatDelegateImplBase(Context context, Window window, AppCompatCallback callback){
mContext = context;
mWindow = window;
mAppCompatCallback = callback;
...

}

AppCompatActivity extends FragmentActivity implements AppCompatCallback, TaskStackBuilder.SupportParentable, ActionBarDrawerToggle.DelegateProvider{

}

现在我们将ActionBarActivity里面的内部逻辑都抽离出来,然后封装成一个单一的代理(delegate)api供调用,AppCompatDelegate.AppCompatDelegate可以被任意带有Window.Callback的安卓对象创建,比如Activity或者Dialog子类。

Android


Android系统在Java层的UI实现。在Android应用程序的四大组件中,只有Activity组件与UI相关,它描述的是

Android应用程序的窗口创建过程

每一个Activity组件都有一个关联的ContextImpl对象,同时,它还关联有一个Window对象,用来描述一个具体的应用程序窗口。

SurfaceFlinger

上一篇下一篇

猜你喜欢

热点阅读