动态代理的角色和静态代理的一样 .
动态代理的代理类是动态生成的 . 静态代理的代理类是我们提前写好的
动态代理分为两类 : 一类是基于接口动态代理 , 一类是基于类的动态代理
基于接口的动态代理----JDK动态代理 基于类的动态代理–cglib 现在用的比较多的是 javasist 来生成动态代理 . 百度一下javasist 我们这里使用JDK的原生代码来实现,其余的道理都是一样的!
静态代理有的它都有,静态代理没有的,它也有! 可以使得我们的真实角色更加纯粹 . 不再去关注一些公共的事情 . 公共的业务由代理来完成 . 实现了业务的分工 , 公共业务发生扩展时变得更加集中和方便 . 一个动态代理 , 一般代理某一类业务 一个动态代理可以代理多个类,代理的是接口!
主要关注Proxy这个类,和InvocationHandler接口, 实现InvocationHandler接口的invoke方法可以对代理对象的方法进行公共的处理,Proxy帮助我们动态生成代理对象 怎样获得动态代理类? 使用Proxy.newProxyInstance( ) 这个静态方法,它接收三个参数,即: 类加载器ClassLoader(可以通过this.getClass().getClassLoader()获得这个类的类加载器,这里我们用InvocationHandler的类加载器) 需要代理的接口,即真实对象 以及InvocationHandler方法处理接口实现类(这个接口只有一个invoke方法)
实现InvocationHandler的invoke方法,增强真实对象的方法
class GeneralInvocationHandler implements InvocationHandler { public void setTarget(Object target) { this.target = target; } //被代理的接口 private Object target; //生成得到的代理类 public Object getProxy() { return Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } //处理代理实例,并返回结果 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("方法执行前"); Object res = method.invoke(target, args); System.out.println("方法执行后"); return res; } public static void main(String[] args) { //真实角色 Rent rent = new Host(); //InvocationHandler代理对象的方法处理程序 GeneralInvocationHandler proxy = new GeneralInvocationHandler(); //设置要代理的真实对象 proxy.setTarget(rent); Rent rent1 = (Rent)proxy.getProxy();//rent1就是动态生成的代理对象 rent1.rent();//增强过的rent方法 }