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