Java动态代理

来源:互联网 发布:龙信数据有限公司 编辑:程序博客网 时间:2024/06/06 07:08

动态代理在程序运行时由反射机制动态创建而成。为其他对象创建一个代理以控制对这个对象的访问。

实现动态代理:

LogInterceptor.java

package com.spring.aop;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class LogInterceptor2 implements InvocationHandler{    private Object target;     public Object newProxyInstance(Object target) {          this.target = target;          return Proxy.newProxyInstance(target.getClass().getClassLoader(),                                 target.getClass().getInterfaces(), this);      }      public void beforeMethod(Method m){        System.out.println(m.getName()+" start");    }    @Override    public Object invoke(Object proxy, Method m, Object[] args)            throws Throwable {        beforeMethod(m);        m.invoke(target, args);        return null;    }    public Object getTarget() {        return target;    }    public void setTarget(Object target) {        this.target = target;    }}

TestUserService.java

@Test    public void testProxy(){        //UserDAO userDAO = new UserDAOImpl();        LogInterceptor2 li2 = new LogInterceptor2();        //li2.setTarget(userDAO);        //UserDAO userDAOProxy =(UserDAO)Proxy.newProxyInstance(userDAO.getClass().getClassLoader(), new Class[]{UserDAO.class}, li2);        UserDAO userDAOProxy =(UserDAO)li2.newProxyInstance(new UserDAOImpl());        userDAOProxy.save(new User());    }

或者
LogInterceptor.java

package com.spring.aop;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class LogInterceptor2 implements InvocationHandler{    private Object target; //  public Object newProxyInstance(Object target) {  //        this.target = target;  //        return Proxy.newProxyInstance(target.getClass().getClassLoader(),  //                               target.getClass().getInterfaces(), this);  //    }      public void beforeMethod(Method m){        System.out.println(m.getName()+" start");    }    @Override    public Object invoke(Object proxy, Method m, Object[] args)            throws Throwable {        beforeMethod(m);        m.invoke(target, args);        return null;    }    public Object getTarget() {        return target;    }    public void setTarget(Object target) {        this.target = target;    }}

TestUserService.java

@Test    public void testProxy(){        UserDAO userDAO = new UserDAOImpl();        LogInterceptor2 li2 = new LogInterceptor2();        li2.setTarget(userDAO);        UserDAO userDAOProxy =(UserDAO)Proxy.newProxyInstance(userDAO.getClass().getClassLoader(), new Class[]{UserDAO.class}, li2);        //UserDAO userDAOProxy =(UserDAO)li2.newProxyInstance(new UserDAOImpl());        userDAOProxy.save(new User());    }

Proxy

Proxy类中的newProxyInstance(ClassLoader loader, Class< ?>[] interface, InvocationHandler h)方法中的三个参数
ClassLoader loader:类加载器(产生代理对象的ClassLoader)
Class< ?>[] interface:产生的代理对象实现的接口
InvocationHandler h:使用哪个Handler进行处理

动态代理产生过程

jdk中的动态代理
Proxy会产生一个代理对象(userDAOProxy),这个对象根据要实现的接口类产生。接口中有哪些方法,产生的代理中就有哪些方法。

代理中的方法如何实现

代理中的方法在调用时,会把代理自身,实现的方法以及参数传到invoke中。invoke方法首先执行自己的逻辑,然后会调被代理对象的method。这样就实现了动态代理。

模拟实现过程:

class &Proxy4 implements UserDAO{    save(User u){    Method m = UserDAO.getClass().getMethod();    li.invoke(this,m,u);    }}
原创粉丝点击