关于jdk 动态代理

通过分析了一下jdk中的动态代理代码,发现其中有几个需要注意的地方。其一就是jdk是通过一个字节码生成工具来生成代理类的字节码class文件的,其二就是生成的这个类是继承了Proxy类的,其三就是在使用时我们需要实现的接口InvocationHandler 中的三个方法,其一就是将目标对象注入,其二就是调用

  1. Proxy.newProxyInstance(target.getClass().getClassLoader(),  
  2.                 target.getClass().getInterfaces(), this);  来动态生成一个代理对象,参数都是关于目标对象的类加载器以及目标对象接口的,同时将当前类的对象也传入了,因为当前类实现了InvocationHandler接口的invoke方法,所以新生成的代理类的对象中会通过传入的this对象来调用invoke方法,invoke方法中又调用了目标对象的业务方法。其实这里向说的是几个新的技术要点,第一个就是反射的应用,通过类名来生成类的对象,其次就是字节码生成工具的使用,还有就是接口可以用来向外暴露其实现类的方法,例如通过接口InvocationHandler向jdk暴露了其中的invoke方法,这样新生成的代理类对象就知道了 传入的this对象有一个invoke方法,于是代理对象就可以在里面调用该方法。 其实这形成的是一个回调。

 

整个过程再理一下:首先有一个接口和一个实现类,然后新建一个自己的类A来实现InvocationHandler 接口的invoke方法,然后调用

  1. Proxy.newProxyInstance(target.getClass().getClassLoader(),  
  2.                 target.getClass().getInterfaces(), this);传入接口列表,当前对象,jdk根据这些信息生成一个接口的实现类(代理类),该代理类实现了接口同时包含对A对象的引用,当在生成的代理类上调用接口方法时他会通过引用来调用A对象的invoke方法。

 

posted @ 2015-07-09 13:47  walkingman  阅读(130)  评论(0)    收藏  举报