#1測試類ide
/** * 動態代理之AOP */ public class TestAOP { public static void main(String[] args) { //1.建立一個被代理類 SuperMan sm = new SuperMan(); //2.返回一個動態代理類 Object obj =MyProxy.getProxyInstance(sm); //3.轉換 Human hm = (Human) obj; //4.調用方法 hm.info(); //換行 System.out.println("=================="); //5.調用方法 hm.fly(); } }
#2.接口測試
//接口 interface Human{ void info(); void fly(); }
#3.被代理類this
//被代理類 class SuperMan implements Human{ @Override public void info() { System.out.println("我是超人"); } @Override public void fly() { System.out.println("我能飛"); } }
#4.兩個固定模塊代理
//提供兩個固定方法 //需求:在這兩個方法之間動態的插入一個方法 class HumanUtil{ public void method1(){ System.out.println("-----方法1------"); } public void method2(){ System.out.println("-----方法2------"); } }
#5.代理類實現方法code
//代理類實現方法 class MyInvocation implements InvocationHandler{ //被代理對象的聲明 Object obj; /* //方法1:給代理對象賦值,經過set方法 public void setObject(Object obj) { this.obj = obj; }*/ //方法2:給代理對象賦值,經過構造器 public MyInvocation(Object obj) { this.obj = obj; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { /** * 需求:在如上提供的兩個方法之間動態插入一個方法 */ HumanUtil humanUtil = new HumanUtil(); //1.調用方法1 humanUtil.method1(); //2.插入動態方法 //這裏實際調用的是被代理類要執行的方法(即動態的方法) Object returnVal = method.invoke(obj, args); //3.調用方法2 humanUtil.method2(); return returnVal; } }
#6.動態的建立一個代理類的對象對象
//動態的建立一個代理類的對象 class MyProxy{ public static Object getProxyInstance(Object obj){ MyInvocation handler = new MyInvocation(obj); //handler.setObject(obj); return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), handler); } }