提到动态代理模式,首先要有两个三个基本的元素:
代理对象,被代理对象 ,代理对象和被代理对象 共同的接口。
java 反射包中提供了Proxy.newProxyInstance 来创建代理对象。下面做一个练习,代理一个对象的方法。
首先定义代理对象和被代理对象 共同的接口
package com.nzh.proxy;
public interface IActivityManager {
int startActivity();
}
真实对象所在类
package com.nzh.proxy;
public class RealObj implements IActivityManager {
int a = 1;
@Override
public int startActivity() {
System.out.println("真实对象RealObj-->startActivity");
return 88;
}
public void setA(int a) {
this.a = a;
}
public void otherMethod() {
}
}
创建代理对象:
package com.nzh.proxy;
import java.lang.reflect.Proxy;
public class DemoTest {
public static void main(String[] args) throws Exception {
// 首先利用反射包中提供的api创建代理对象
ClassLoader loader = Thread.currentThread().getContextClassLoader();
/**
* loader:这里传递当前线程的classloader interfaces : 表示代理对象 和 被代理对象 共同的接口 的
* Class,Class[] 类型 对象。 h : 回调处理接口
*/
Class clazzInterface = Class.forName("com.nzh.proxy.IActivityManager");
Class[] interfaces = new Class[] { clazzInterface };
IActivityManager realObj = new RealObj();
// 生成代理对象
Object proxy = Proxy.newProxyInstance(loader, interfaces,
new MyInvocationHandler(realObj));
// 调用代理对象方法
IActivityManager proxyObj = (IActivityManager) proxy;
proxyObj.startActivity();
}
}
package com.nzh.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class MyInvocationHandler implements InvocationHandler {
// 真实对象
IActivityManager realObj;
public MyInvocationHandler(IActivityManager realObj) {
this.realObj = realObj;
}
/**
* @param proxyObj
* 代理对象
* @param method
* 真实对象 的 方法反射对象
* @param arg2
* 真实对象 的 方法参数反射对象
*/
@Override
public Object invoke(Object proxyObj, Method method, Object[] arg2)
throws Throwable {
String realObjName = method.getName();
// 此方法会被代理,因为不是 代理对象和被代理对象 共同接口中的方法
if ("startActivity".equals(realObjName)) {
interceptMethod();
}
return method.invoke(realObj, arg2);
}
public void interceptMethod() {
System.out.println("执行真实对象前,先拦截执行自定义方法。");
System.out.println("(这里也可以修改真实对象的一些属性...)");
}
}
测试代理 RealObj 对象的startActivity方法。
运行结果:执行真实对象前,先拦截执行自定义方法。
(这里也可以修改真实对象的一些属性...)
真实对象RealObj-->startActivity