反射_动态代理和AOP
最理想的效果是:代码块1、2、3既可以执行方法A,又无须在程序中以硬编码的方式直接调用深色代码的方法
interface Human { void info(); void fly(); } //被代理类 class Superman implements Human { @Override public void info() { System.out.println("我是超人"); } @Override public void fly() { System.out.println("I can fly"); } } class HumanUtil { public void method1() { System.out.println("法一"); } public void method2() { System.out.println("法二"); } } //代理类 class MyInvocationHandlers implements InvocationHandler { Object obj;//被代理类对象的声明 public void setObj(Object obj) { this.obj = obj; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { HumanUtil humanUtil = new HumanUtil(); humanUtil.method1(); Object returnVal = method.invoke(obj, args); humanUtil.method2(); return returnVal; } } class Myproxy { //动态的创建一个代理类的对象 public static Object getProxyInstance(Object obj) { MyInvocationHandlers handler = new MyInvocationHandlers(); handler.setObj(obj); return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), handler); } } public class TestAOP { public static void main(String[] args) { Superman superman = new Superman();//创建了一个被代理类的对象 Object object = Myproxy.getProxyInstance(superman);//返回一个代理类的对象 Human human = (Human) object; //通过代理类的对象调用重写的抽象方法 human.info(); human.fly(); } }