前言
插件化開發所涉及到的技術點非常多,比如程序的啓動流程、四大組件啓動流程、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