插件化開發(一)代理模式

前言

      插件化開發所涉及到的技術點非常多,比如程序的啓動流程、四大組件啓動流程、ClassLoader原理、上下文Context、AMS原理、反射、代理等。本篇主要簡單介紹代理模式,爲後面介紹插件化實現做知識鋪墊。

 

 1 //
 2 public interface IShop {
 3     void buy();
 4 }
 5 
 6 //
 7 public class Boss implements IShop {
 8     @Override
 9     public void buy() {
10         System.out.println("I am boss,I buy buy buy");
11     }
12 }
13 
14 //
15 public class Assistant implements IShop {
16     private IShop mBoss;
17     Assistant(IShop shoper) {
18         mBoss = shoper;
19     }
20 
21     @Override
22     public void buy() {
23         mBoss.buy();
24     }
25 }
26 
27 //
28 public class ProxyDemo {
29     public static void main(String[] args) {
30         IShop boss = new Boss();
31         IShop assitant = new Assistant(boss);
32         assitant.buy();
33     }
34 }

 運行結果

I am boss,I buy buy buy

動態代理

 1 public interface IShop {
 2     void buy();
 3 }
 4 
 5 public class Boss implements IShop {
 6     @Override
 7     public void buy() {
 8         System.out.println("I am boss,I buy buy buy");
 9     }
10 }
11 
12 //
13 import java.lang.reflect.InvocationHandler;
14 import java.lang.reflect.Method;
15 
16 public class DynamicProxy implements InvocationHandler {
17     private Object mObject;
18 
19     DynamicProxy(Object object) {
20         mObject = object;
21     }
22 
23     @Override
24     public Object invoke(Object proxy, Method method, Object[] objects) throws Throwable {
25         System.out.println("invoke methodName=" + method.getName());
26         method.invoke(mObject, objects);
27         return null;
28     }
29 }
30 
31 //Client
32 import java.lang.reflect.InvocationHandler;
33 import java.lang.reflect.Proxy;
34 
35 public class Client {
36     public static void main(String[] args) {
37         //創建boss類
38         IShop boss = new Boss();
39         //創建動態代理
40         InvocationHandler proxyHandler = new DynamicProxy(boss);
41         ClassLoader classLoader = boss.getClass().getClassLoader();
42         //動態創建代理類
43         IShop assitant = (IShop) Proxy.newProxyInstance(classLoader, new Class[]{IShop.class}, proxyHandler);
44         assitant.buy();
45     }
46 }

結果

invoke methodName=buy
I am boss,I buy buy buy

v

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章