public static void main(String[] args) {
List<String> list = new ArrayList<>();
List proxy = (List)getProxy(list, new MyAdvice());
System.out.println("代理类:"+proxy.getClass());
proxy.add("元素1");
}
public static Object getProxy(final Object target, final AdviceInterface advice){
Object proxy = Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 方案一:直接在代理里写日志追踪
// System.out.println(method.getName()+"方法开始");
// Object returnValue = method.invoke(target,args);
// System.out.println(method.getName()+"方法结束");
// 方案二:通过写一个类,将追踪的方法封装在类里,
// 代理中调用方法(即模板,以后改业务内容时就不用改代理里的代码了)
advice.beforeMethod(method);
Object returnValue = method.invoke(target, args);
advice.afterMethod(method);
return returnValue;
}
});
return proxy;}
总结:这类模式的理念是,把功能抽取成为一个对象,(即把对象传进来,使用这个对象调用它里面的方法)。
由于要调用对象,但又不知道对象的名字,所以通过接口来约定。(即,我知道你一定实现这个接口,我调用这个接口的名字就可以了)。这叫通行的契约。
联系客服