JAVA动态代理(拦截器)

来源:互联网 发布:什么是犀牛软件 编辑:程序博客网 时间:2024/06/03 22:01
定义一个接口

 

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();}}