#1测试类
/** * 动态代理之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.被代理类
//被代理类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.代理类实现方法
//代理类实现方法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); }}