动态代理JDKf方式InvocationHandler、Proxy

来源:互联网 发布:现货外盘软件 编辑:程序博客网 时间:2024/05/18 01:07

动态代理是一种设计模式  jdk动态代理只能代理接口


主要原理是java的反射机制和泛型


InvocationHandler 事务处理类的接口  这里实现代理过程中业务处理的逻辑 ,比如一个火车票代理点,在这里就可以新增收取手续费的功能


invoke方法第一个参数是真正的代理类,第二个参数是被代理的方法,第三个参数是方法中传入的参数

package dongtaidaili;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;/** * @author  lh     * @date 创建时间:2017年4月28日 上午9:58:30    */public class PersonHandler implements InvocationHandler {private Object obj;          public PersonHandler(Object obj){          this.obj=obj;      }  @Override/** * proxy:  指代我们所代理的那个真实对象       method:  指代的是我们所要调用真实对象的某个方法的Method对象       args:  指代的是调用真实对象某个方法时接受的参数 *///当我们通过代理对象调用一个方法的时候,这个方法的调用就会被转发为由InvocationHandler这个接口的 invoke 方法来进行调用//method是指被代理的方法public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//在转调具体目标对象之前,可以执行一些功能处理//在这里就可以实现过滤System.out.println("执行method方法之前    proxy name="+proxy.getClass().getName()); //转调具体目标对象的方法    Object result = method.invoke(obj, args);      //在转调具体目标对象之后,可以执行一些功能处理    System.out.println("执行method方法之后");              //动态生成代理类    return result; }}

Proxy


这个类是用来生成真正代理的类

在完成如下代码段之后

 PersonDao proxy = (PersonDao)Proxy.newProxyInstance(pDao.getClass().getClassLoader(), pDao.getClass().getInterfaces(), handler);  

proxy就可以当做是被代理的类来使用


在这个方法中第一个参数是被代理类的类加载器

第二个是实现的哪个接口

第三个是代理事务处理类


0 0
原创粉丝点击