package cn.hunnu.aop.proxy; public interface Dog { //info public void info(); //run public void run(); }
package cn.hunnu.aop.proxy; /** * Dog 实现类 * @author 肖波 * */ public class DogImpl implements Dog { @Override public void info() { System.out.println("I am a lovely dog!"); } @Override public void run() { System.out.println("I am running fast!"); } }
package cn.hunnu.aop.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class ProxyHandler implements InvocationHandler { //需要被代理的对象 private Object target; /** * 执行代理的目标方法时,该invoke方法会被调用,其实这是 * 表面现象,实际上,在创建动态代理的时候,动态代理实现 * 了目标对象的所有接口,并且在指定的方法实现中,重复目标 * 对象的方法实现,也就是下面的method.invokke(target,args) */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = null; if(method.getName().equals("info")) { System.out.println("===在调用info()方法之前的处理区域==="); result = method.invoke(target, args); System.out.println("===在调用info()方法之后的处理区域==="); } else if(method.getName().equals("run")) { System.out.println("===在调用run()方法之前的处理区域==="); result = method.invoke(target, args); System.out.println("===在调用run()方法之后的处理区域==="); } return result; } /** * 该setter方法就是便于spring注入目标对象 * @param target:目标对象,实例中的DogImpl对象 */ public void setTarget(Object target) { this.target = target; } }
package cn.hunnu.aop.proxy; import java.lang.reflect.Proxy; /** * 代理工厂 * @author 肖波 * */ public class ProxyFactory { /** * 生成动态代理对象 * @param target :目标对象,将被代理。 * @return */ public static Object getProxy(Object target) { //代理处理类 ProxyHandler handler = new ProxyHandler(); handler.setTarget(target); Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), handler); return proxy; } }
package cn.hunnu.aop.proxy; /** * test class * @author 肖波 * */ public class AOPTest { public static void main(String areg[]) { //创建目标对象 Dog dog = new DogImpl(); //生成动态代理对象 Dog proxy = (Dog)ProxyFactory.getProxy(dog); //测试代理方法AOP proxy.info(); proxy.run(); } }
运行结果:
===在调用info()方法之前的处理区域===
I am a lovely dog!
===在调用info()方法之后的处理区域===
===在调用run()方法之前的处理区域===
I am running fast!
===在调用run()方法之后的处理区域===