1.DogIntercepter
package elia;
// 拦截器其实和普通的类没什么区别,称为拦截器只是就它的行为而言
public class DogIntercepter {
public void methodBefore(){
System.out.println("=======Intercepter Method 1======");
}
public void methodAfter(){
System.out.println("=======Intercepter Method 2======");
}
}
2.ProxyHandler
package elia;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
// 该类可以动态调用目标对象的方法
public class ProxyHandler implements InvocationHandler{
// 需要被代理的目标对象
private Object target;
// 用于设置传入目标对象的方法
public void setTarget(Object target) {
this.target = target;
}
// 创建拦截器实例
DogIntercepter di = new DogIntercepter();
// 执行代理的目标方法时,该invoke方法会被自动调用
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result = null;
if(method.getName().equals("info")) {
di.methodBefore();
result = method.invoke(target, args);
di.methodAfter();
} else {
result = method.invoke(target, args);
}
return result;
}
}
3.MyProxyFactory
package elia;
import java.lang.reflect.Proxy;
// 代理工厂根据目标对象和对应的拦截器生成一个新的代理对象,代理对象的方法是目标方法和拦截器方法的组合
public class MyProxyFactory {
public static Object getProxy(Object object){
// 代理的处理类
ProxyHandler handler = new ProxyHandler();
// 把Dog实例托付给代理操作
handler.setTarget(object);
// 第一个参数是用来创建动态代理的ClassLoader对象,只要该对象能访问Dog接口即可
// 第二个参数是接口数组,(eg:object可以是Dog类型的DogImpl实例)
// 第三个参数是代理包含的处理实例
// 该方法创建的代理类是JVM在内存中动态创建的
return Proxy.newProxyInstance(DogImpl.class.getClassLoader(), object.getClass().getInterfaces(), handler);
}
}
4.TestDog
package elia;
public class TestDog {
public static void main(String[] args){
// 代理的目标对象
Dog targetObject = new DogImpl();
Dog dog = null;
// 以目标对象创建代理
Object proxy = MyProxyFactory.getProxy(targetObject);
if(proxy instanceof Dog){
dog = (Dog)proxy;
dog.info();
dog.run();
}
}
}