什么是动态代理

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

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

看下面的例子:

假如有一个用户的实体类叫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的用户信息成功添加到数据库表中...
开始记录日志,添加用户方法执行结束...





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值