反射_动态代理和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();
}
}
还没有评论,来说两句吧...