简介
就是能够在运行时动态编译执行的代理功能模块,由于是动态执行,因此可以根据程序策略或状态动态的生成对应的类和实例。
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{@Overridepublic void save(User user) {System.out.println("save");}
InvocationHandler的实现类,也就是调用处理类,调用处理程序
public class UserDaoProxyHandler implements InvocationHandler{private UserDao UserDao;public Handler(UserDao ud) {this.UserDao = ud;}@Overridepublic 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());//调用代理类的方法}}
创建流程图

调用时序图
