增强一个类的方法有三种办法
1:继承 ————能够控制这个类的构造
2:装饰者模式——增强的类和被增强的类实现相同的接口,增强的类中获得被增强的类的引用, 缺点是接口中方法过多,只增强某个方法其他方法也要重写
3:动态代理———被增强的类实现了接口
代理的概述:
—–代理 , 实现接口, 本来能做的事 代理也能做还能增强
JDK的代理 Proxy
Object obj = (Object)Proxy.newProxyInstance(Object.class.getClassLoader,new Class[]{Object.class},hander);
三个参数分别是:类的加载器 , 被增强的类实现的所有接口 , 关键是第三个参数 InvocationHandler , 这是一个接口 , 得自己去实现
//接口
public interface Waiter {
void serve();
String sayhello(String name);
}
//实现类
public class Waitress implements Waiter {
@Override
public void serve() {
System.out.println("服务中... ...");
}
@Override
public String sayhello(String name) {
return "hello"+name;
}
}
//增强实现
@Test
public void demo1(){
final Waiter waiter = new Waitress();
// waiter.serve();
ClassLoader classLoader = waiter.getClass().getClassLoader();
Class[] interfaces = waiter.getClass().getInterfaces();
Waiter waiter1 = (Waiter)Proxy.newProxyInstance(classLoader, interfaces, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("weixiao");
Object invoke = method.invoke(waiter, args);
return invoke;
}
});
// waiter1.serve();
String 张三 = waiter1.sayhello("张三");
System.out.println(张三);
}
}