根据上面提到的java的内建代理模式,要实现一个InvocationHandler,下面这段代码展示了MyInvocationHandler 的主要部分:
private class MyInvocationHandler implements InvocationHandler { String backendClassName;//实际的类名Object backend;//实际的类对象public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { /** * 在第一载入的时候通过loadClass来载入所需要的服务实现对象,后边每次检查java文件是否被修改过,* 如果被修改就unload当前的对象,编译并重新载入该类。
*/ Class clz = loadClass(backendClassName);if (backend.getClass() != clz) { backend = newDynaCodeInstance(clz);
}
// 调用有效的对象的方法return method.invoke(backend, args);}在MyInvocationHandler中保存了实现接口的类名和该类的一个对象,该对象也就是通过newDynaCodeInstance()方法得到的对象。在每一次调用该对象的方法的时候,java的Proxy机制保证了系统会自动调用MyInvocationHandler的invoke方法。
这里采用反射进行动态载入的程序,调用的实际工作是在InvocationHandler的invoke方法中做的,因此InvocationHandler要保存实际的对象。
代理模式的好处是从使用者看来如同调用实际的对象是一样的,而实际上可以通过代理对象,程序可以动态采用不同的接口实现来完成工作,这一过程只需要在Proxy.newProxyInstance()中给定不同的实现类即可。
