定义一个接口
package hb.servlet.intercepter;
public interface Dog {
public void info();
public void run();
}
接口的实现
package hb.servlet.intercepter;
import org.apache.log4j.Logger;
public class DogImpl implements Dog {
private static Logger log = Logger.getLogger(DogImpl.class);
public void info() {
log.info("一只猎狗");
}
public void run() {
log.info("我奔跑迅速");
}
}
拦截器方法
package hb.servlet.intercepter;
public class DogIntercepter {
public void method1() {
System.out.println("111111111模拟通用方法一");
}
public void method2() {
System.out.println("222222222模拟通用方法二");
}
}
代理类的实现
package hb.servlet.intercepter;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class ProxyHandler implements InvocationHandler {
private Object target;
DogIntercepter di = new DogIntercepter();
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result = null;
if (method.getName().equals("info")) {
di.method1();
result = method.invoke(target, args);
di.method2();
} else {
result = method.invoke(target, args);
}
return result;
}
public void setTarget(Object o) {
this.target = o;
}
}
代理类工厂
package hb.servlet.intercepter;
import java.lang.reflect.Proxy;
public class MyProxyFactory {
public static Object getProxy(Object object) {
ProxyHandler handler = new ProxyHandler();
handler.setTarget(object);
// 第一个参数是用来创建动态代理的ClassLoader对象,只要该对象能访问Dog接口即可
// 第二个参数是接口数组,正是代理该接口的数组
// 第三个参数是代理包含的处理实例
return Proxy.newProxyInstance(DogImpl.class.getClassLoader(), object
.getClass().getInterfaces(), handler);
}
}
测试
package hb.servlet.intercepter;
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();
}
}