探讨代理模式与Java反射机制的应用
代理模式,相信大多数人都非常熟悉,常见的实现方式是通过公共接口的方式,让我们的目标类和代理类实现同一接口,在代理类中调用目标类对象的方法。通过接口的方式,有个不好的地方,就是对每个目标类都要写一对与之相对应的接口和代理类,如果业务类很多,就是非常繁锁的工作了。而加入反射机制的代理模式,可实现一个公共的代理类,省去我们不少功夫。Java的java.lang.reflect包及其子包中提供了Class、Method、Annotation等有用的类。下面,写个方法代理的类MethodProxy,实现动态地调用对象的方法。
import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;/** * 方法代理类 * @author rongxinhua * */public class MethodProxy {private Class clazz;//对象所属的类private Object target;//目标对象private Method method;//目标方法private Object[] params;//参数数组@SuppressWarnings("unchecked")public MethodProxy(Object target, String methodName, Object ... params) {rebindTarget(target, methodName, params);//设置目标对象与方法}/** * 重新设置目标对象与方法 * @param target * @param methodName * @param params */public void rebindTarget(Object target, String methodName, Object ... params) {this.target = target;this.clazz = target.getClass();rebindMethod(methodName, params);//设置目标方法}/** * 重新设置目标方法 * @param methodName * @param params */public void rebindMethod(String methodName, Object ...params) {this.params = params;int paramLength = params.length;Class[] paramTypes = new Class;for(int i = 0 ; i < paramLength ; i ++ ) {paramTypes = params.getClass();}try {this.method = clazz.getMethod(methodName, paramTypes);} catch (SecurityException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();}}/** * 动态调用已绑定的方法 */public void doMethod() {try {this.method.invoke(target, params);} catch (IllegalArgumentException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}}}
这样就可以实现动态地调用某个对象的某个方法了,写个测试代码如下:
<div class="dp-highlighter"><div class="bar"><div class="tools">
页:
[1]