java中的动态代理和面向切面编程(可以体现动态代理的优势) |
下边内容来自书籍:疯狂java讲义
扫描二维码关注公众号,回复:
1483580 查看本文章
代码如下:
package 动态代理.ProxyAndAOP; public interface Dog { // info方法声明 public void info(); // run方法声明 public void run(); }
package 动态代理.ProxyAndAOP; public class GunDog implements Dog{ @Override public void info() { // TODO Auto-generated method stub System.out.println("我是一只猎狗"); } @Override public void run() { // TODO Auto-generated method stub System.out.println("迅速奔跑"); } }
package 动态代理.ProxyAndAOP; public class DogUtils { //第一个拦截方法 public void method1(){ System.out.println("模拟第一个通用方法-------------------------------"); } //第二个拦截方法 public void method2(){ System.out.println("-------------------------------模拟第二个通用方法"); } }
package 动态代理.ProxyAndAOP; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class MyInvocationHandler implements InvocationHandler { // 需要被代理对象 private Object target; public void setTarget(Object target) { this.target = target; } // 执行动态代理所有方法时,都会变成执行一下的invoke方法 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // TODO Auto-generated method st DogUtils du = new DogUtils(); // 执行DogUtils对象中的method1 du.method1(); // 下边以target作为主调来执行method方法 Object result = method.invoke(target, args); // 执行DogUtils对象中的method2 du.method2(); return result; } }
package 动态代理.ProxyAndAOP; import java.lang.reflect.Proxy; import 动态代理.Dog; public class MyProxyFactory { // 为指定的target生成动态代理对象 public static Object getProxy(Object target) { // 创建一个MyInvocationHandler对象 MyInvocationHandler handler = new MyInvocationHandler(); // 为MyInvocationHandler设置target对象 handler.setTarget(target); // 创建并返回一个动态代理 // newProxyInstance(target.getClass().getClassLoader(), target.getClass(), handler); return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),handler); } }
package 动态代理.ProxyAndAOP; public class Test { public static void main(String[] args) { //创建一个原始的GunDog对象作为target Dog target=new GunDog(); //以指定的target来创建动态代理 Dog dog=(Dog) MyProxyFactory.getProxy(target); dog.info(); dog.run(); } }
控制台输出如下: