简介
就是能够在运行时动态编译执行的代理功能模块,由于是动态执行,因此可以根据程序策略或状态动态的生成对应的类和实例。
InvocationHandler,是代理实例的调用处理程序 实现的接口
invoke,直接的理解为:当调用被代理对象的某个方法时,实际上会在该接口的实现类上调用invoke方法。也就是说,invoke方法就是代替原来执行的方法。
public interface InvocationHandler {
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable;
}
Proxy.newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
此方法会生成代理类的java文件,并编译生成.claas文件,动过ClassLoader创建该代理类
JDK的动态代理例子
一个接口
public interface UserDao {
void save(User user);
}
接口的实现类
public class UserDaoImpl implements UserDao{
@Override
public void save(User user) {
System.out.println("save");
}
InvocationHandler的实现类,也就是调用处理类,调用处理程序
public class UserDaoProxyHandler implements InvocationHandler{
private UserDao UserDao;
public Handler(UserDao ud) {
this.UserDao = ud;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("start");//前置处理
method.invoke(UserDao, args);
System.out.println("end");//后置处理
return "done";
}
测试代理使用类
public class TestProxy {
public static void main(String [] args){
UserDao ud = new UserDaoImpl();
UserDaoProxyHandler handler = new UserDaoProxyHandler(ud);//创建调用处理类
//得到代理类实例
UserDao proxy = (UserDao) Proxy.newProxyInstance(UserDao.class.getClassLoader(), new Class[]{UserDao.class}, handler);
proxy.save(new User());//调用代理类的方法
}
}
创建流程图
调用时序图