动态代理与AOP
TestAOP
package com.aff.dynamic; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; interface Human { void info(); void fly(); } // 被代理类 class SuperMan implements Human { @Override public void info() { System.out.println("我是超人"); } @Override public void fly() { System.out.println("我会飞"); } } class HumanUtil { public void method1() { System.out.println("====方法1===="); } public void method2() { System.out.println("====方法2===="); } } // 代理类 class MyInvocationHandler2 implements InvocationHandler { Object obj;// 声明被代理类对象 public void setObject(Object obj) { this.obj = obj; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { HumanUtil h = new HumanUtil(); // 两个方法中间插入,面向切面 h.method1(); Object returnVal = method.invoke(obj, args); h.method2(); return returnVal; } } // 动态创建一个代理类的对象 class MyProxy { public static Object getProxyInstance(Object obj) {// 通过下面赋值, obj就是被代理类对象 MyInvocationHandler2 myhandler = new MyInvocationHandler2(); myhandler.setObject(obj); return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), myhandler); } } public class TestAOP { public static void main(String[] args) { SuperMan sm = new SuperMan();//创建被代理类的对象 Object obj = MyProxy.getProxyInstance(sm);//返回代理类的对象 Human hm = (Human)obj; hm.info();//通过代理类的对象调用重写的抽象方法 System.out.println(); hm.fly(); } }
输出结果:
====方法1====
我是超人
====方法2====
====方法1====
我会飞
====方法2====
All that work will definitely pay off