代理模式:
1.代理模式角色:
1) 被代理者。
2) 代理者。繼承同一個父介面。
2.代理的作用:
1) 為已經存在一的多個具有相同的介面的目標順的方法增加一些相同的功能。
2) 代理類是使用反射在JVM運行時動態產生的,所以其使用有很好的靈活性,可以在任何商務邏輯之前和之後加入自己想加入的代碼。
3.代理的原理:
4.jdk中動態代理實現
java的動態代理要求去實現一個InvocationHandlerv介面。而在它的實作類別中只要去實現一個方法。
public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {start();Object o = method.invoke(obj,args);end();return o;}
第一個參數proxy,表示代理類,第二個方法則是表示,被代理類的需要調用的方法。每三個參數被調用的方法中傳入的參數。
然後通過Method中的invoke(obj,args)去反射調用方法。
在這個方法之前就可以去增加各種功能。從而實現動態代理功能。
5.動態代理的建立:
1)直接通過Prxoy執行個體化:
Person person = new Person();MyProxy myProxy = new MyProxy(person);Human personProxy = (Human) Proxy.newProxyInstance(Person.class.getClassLoader(), Person.class.getInterfaces(),myProxy);// 以下代碼則會報錯。// Person personProxy =// (Person)Proxy.newProxyInstance(Person.class.getClassLoader(),Person.class.getInterfaces(),// myProxy);personProxy.save();
直接通過Proxy的執行個體化得到代理對象 ,然後調用方法。
2)通過獲得代理類的位元組碼,然後得到構造方法,傳入InvocationHandlerv.class獲得代理類。實現動態代理。
Person person = new Person();MyProxy myProxy = new MyProxy(person);Class<?> clazzProxy = Proxy.getProxyClass(Person.class.getClassLoader(), Person.class.getInterfaces());Constructor<?> constructor = clazzProxy.getConstructor(InvocationHandler.class);//Constructor<?> constructor = clazzProxy.getConstructor(MyProxy.class);//必須要用InvocationHandler用它的實作類別是不可以的!Human personPrxoy = (Human)constructor.newInstance(myProxy);personPrxoy.save();
----------------------
android培訓、java培訓、期待與您交流! ----------------------