proxy 简化版本

public interface People {
    public String eat(String param);
}

public class Jack implements People {
    @Override
    public String eat(String param) {
        System.out.println("=========Jack老师喜欢吃东=======");
        return "=========Jack老师喜欢吃东=======";
    }
}

public class Advice implements InvocationHandler1 {
    
    People people;//接口,传进来实例
    
    public Advice(People people) {
        this.people = people;
    }
    
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //前置增强
        before();
        //被代理方
        Object value = method.invoke(people,args);
        //后置增强
        after();
        return value;
    }

    private void before() {
        System.out.println("===========jack吃饭之前�?要洗�?==========");
    }

    private void after() {
        System.out.println("===========jack吃完饭要洗碗=============");
    }
}

public class MyTest {
    public static void main(String[] args) {
        People proxyObject = (People) Proxy1.newProxyInstance(MyTest.class.getClassLoader(),
                new Class<?>[] { People.class }, new Advice(new Jack())); // 获取代理,MyTest.class.getClassLoader()是类加载器,
        //new Advice是对实现类new Jack()的增强,People.class是接口,在吃饭之前之后要洗手,

        proxyObject.eat("chi");// proxyObject是在内存的代理对象,对象名字$Proxy数字,
  
        //proxyObject = com.zhuguang.jack.aop.jdkProxy.Jack@5e5792a0,里面的h = com.zhuguang.jack.aop.jdkProxy.Advice@26653222

     // $Proxy0/1 extends Proxy1 implements People,Proxy里面有一个属性InvocationHandler h; // proxyObject.eat("chi")调用的是h.invoke(Object proxy, Method method, Object[] // args), // h.invoke()方法调到advice.invoke(), } }

 

上一篇:c++ STL之map容器


下一篇:华为笔试