我们在Android开发种经常会在源码中看到动态代理,今天我们就来聊聊代理模式。
代理模式是干嘛的呢? 代理模式可以在不改变原有类逻辑代码的情况下,操控该类对该类,可以对该类的进行功能上修改或增强。
举例子环节到了,先来一个静态代理模式:
public interface HrAction { void action(); }
public class HrWorker implements HrAction { @Override public void action() { Log.d("hr","招聘,裁人,等等工作"); } }
public class HrProxy implements HrAction{ HrAction hrAction; public HrProxy(HrAction hrAction) { this.hrAction = hrAction; } @Override public void action() { Log.d("","action1"); hrAction.action(); Log.d("","action2"); } }
public class HrWorker implements HrAction { @Override public void action() { Log.d("hr","招聘,裁人,等等工作"); } }
public class Test { void test(){ HrWorker hrWorker=new HrWorker(); HrProxy hrProxy=new HrProxy(hrWorker); hrProxy.action(); } }
作为一个代理类如果每次都需要转入不同对象,那也太不方便了,所以就引申了动态代理。
动态代理主要是对代理类的修改:
public class HrProxy implements InvocationHandler{ private Object object = null; public HrProxy(Object object) { this.object = object; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Log.d("",""); Object obj=method.invoke(object,args); return obj; } }
代理类继承一个InvocationHandler接口,实现invoke方法。
void test(){ HrWorker hrWorker=new HrWorker(); HrProxy hrProxy=new HrProxy(hrWorker); ClassLoader classLoader=hrWorker.getClass().getClassLoader(); HrWorker hrWorker1= (HrWorker) Proxy.newProxyInstance(classLoader,new Class[]{},hrProxy); hrWorker1.action(); }
调用的时候需要通过Proxy.newProxyInstance()方法来生产代理类。