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接口的一系列类。