/**
* @author wjj
* @date 2021/3/1 14:12
*/
public class ProxyDemo {
public static void main(String[] args) {
SeniorLawyer seniorLawyer = new SeniorLawyer();
Lawyer l = (Lawyer)Proxy.newProxyInstance(seniorLawyer.getClass().getClassLoader(), seniorLawyer.getClass().getInterfaces(), (proxy, method, args1) -> {
if ("goToCourt".equals(method.getName())){
System.out.println("准备材料");
method.invoke(seniorLawyer, args1);
}
return null;
});
l.goToCourt();
}
interface Lawyer {
void goToCourt();
}
static class SeniorLawyer implements Lawyer{
@Override
public void goToCourt() {
System.out.println("totally win!");
}
}
}
- 参数一:生成代理对象使用哪个类装载器【一般我们使用的是被代理类的装载器】
- 参数二:生成哪个对象的代理对象,通过接口指定【指定要被代理类的接口】
参数三:生成的代理对象的方法里干什么事【实现handler接口,我们想怎么实现就怎么实现】
代理对象拥有目标对象相同的方法【因为参数二指定了对象的接口,代理对象会实现接口的所有方法】
- 用户调用代理对象的什么方法,都是在调用处理器的invoke方法。【被拦截】
- 使用JDK动态代理必须要有接口【参数二需要接口】
要实现动态代理必须要有接口的,动态代理是基于接口来代理的(实现接口的所有方法),如果没有接口的话我们可以考虑cglib代理。
cglib代理也叫子类代理,从内存中构建出一个子类来扩展目标对象的功能!
代理模式是我们写代码中用得很多的一种模式了,Spring的AOP底层其实就是动态代理来实现的—>面向切面编程
其实只要记住一点:原有的对象需要额外的功能,想想动态代理这项技术!