什么是动态代理

来源:互联网 发布:罗马全面战争火攻算法 编辑:程序博客网 时间:2024/06/14 22:58

动态代理就是可以任意的控制任意对象的执行过程,意思就是说这个对象的执行过程可以由客户端灵活的指定,可能这样说还是不太明确,通俗说就是

本来应该自己做的事情,因为没有某种原因不能直接做,只能请别人代理做。被请的人就是代理。比如春节买票回家,由于没有时间,只能找票务中介来买,这就是代理模式。

看下面的例子:

假如有一个用户的实体类叫User

Java code

package org.chinasoft.proxy.test; /** * 用户实体类 * @author lilei * */public class User {    private String id;         public User(String id) {        this.id = id;    }     public String getId() {        return id;    }     public void setId(String id) {        this.id = id;    } }

实现对实体类User类的数据管理,UserDAO

Java code

package org.chinasoft.proxy.test; public interface UserDAO {    //可以有很多的方法(del,update,query...)    void addUser(User user); }
UserDAO的实现
package org.chinasoft.proxy.test; public class UserDAOMySQLImpl implements UserDAO {         public void addUser(User user) {        // connect to MySQL,insert a row recoder        System.out.println("connect to MySQL DataBase...");        System.out.println("id=" + user.getId() +  "的用户信息成功添加到数据库表中...");    } }
现在假如说,有这样一个需求,就是说想在把用户添加到数据库调用addUser方法之前和之后记录下当前操作的
的日志(比如某某用户被添加到数据库等等)

LogHandler类,功能是负责控制任意被代理对象中任意方法的执行过程,简单说具体到本类中功能就是记录方法
运行前后的日志

package org.chinasoft.proxy.test; import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method; public class LogHandler implements InvocationHandler {    //持有被代理对象的引用(此引用可以有外部灵活制定的)    private Object target;         public LogHandler(Object target) {        this.target = target;    }         public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        System.out.println("开始记录日志,添加用户方法开始执行...");        method.invoke(target, args);        System.out.println("开始记录日志,添加用户方法执行结束...");        return null;    } }

测试类:TestProxy

package org.chinasoft.proxy.test; import java.lang.reflect.Proxy; public class TestProxy {         public static void main(String[] args) {        UserDAO daoImpl  = new UserDAOMySQLImpl();        //拿到实现被代理类(UserDAO)的实现类的对象        UserDAO dao = (UserDAO)getInstance(daoImpl);                 User user = new User("001");        dao.addUser(user);    }     /**     *      * @param dao 被代理的对象     * @return    返回的是实现了被代理对象的对象(JDK $Proxy0)     */    public static Object getInstance(UserDAO dao) {        Object o = Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(),                 new Class[]{UserDAO.class},                 new LogHandler(dao));        return o;    }     }
程序运行
开始记录日志,添加用户方法开始执行...connect to MySQL DataBase...id=001的用户信息成功添加到数据库表中...开始记录日志,添加用户方法执行结束...





原创粉丝点击