java动态代理

public interface Dao {
    void add();
    void delete();
    void updata();
    void query();
}
public class MysqlDaoImpl implements Dao{
    @Override
    public void add() {
        System.out.println("Mysql增加一条数据");
    }

    @Override
    public void delete() {
        System.out.println("Mysql删除一条数据");

    }

    @Override
    public void updata() {
        System.out.println("Mysql更新一条数据");

    }

    @Override
    public void query() {
        System.out.println("Mysql查询一条数据");

    }
}
 @Test
    public void test3(){
       Dao mysqlDao = new MysqlDaoImpl();
        InvocationHandler  invocationHandler = new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println(method.getName() + "开始操作之前");
                method.invoke(mysqlDao,args);
                System.out.println(method.getName() + "开始操作之后");
                return null;
            }
        };
       Dao dao = (Dao) Proxy.newProxyInstance(mysqlDao.getClass().getClassLoader(),
               mysqlDao.getClass().getInterfaces(),
               invocationHandler);
       dao.delete();
       dao.add();
       dao.updata();
#  步骤
## 1 动态代理的类首先需要一个接口 Dao
## 2 其次需要代理的类要实现这个接口 MysqlDao Impl implements Dao
## 3 在客户端中 创造InvocationHandler的内部类,重写invoke方法,
	method.invoke(mysqlDao,args), mysqlDao 为代理类的对象,
	method.invoke前后就可以是代理之前之后的操作方法。
## 4 在客户端中获取代理对象
 Dao dao = (Dao) Proxy.newProxyInstance( mysqlDao .getClass() . getClassLoader(),
    mysqlDao.getClass().getInterfaces(),
               invocationHandler),注意:类型必须为接口类型,
               因为其代理只能代理实现接口的方法,第一个参数目前验证好像没啥用
               (初级选手哈),第二个参数为传入代理类的接口,第三个内部类对象。

## 总结:
上面的代码只能代理一个实现Dao接口的类,其实可以改造下。
Dao mysqlDao = new MysqlDaoImpl(),
把mysqlDao set到内部类所在的外部类中;
或者另写一个类A继承InvocationHandler,把mysqlDao 传入A类中,这样就可以代理实现Dao接口的一系列类。      
               
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值