1,什么是动态代理:
在程序的运行过程中创建出代理对象;用该对象间接实现相应的 接口和方法;
2,动态代理的好处:
- 可以对功能进行增强和拦截;
 - 且在多个接口的情况下,代理模式可以直接实现所有的接口;无需一一去使用 实现类 或 匿名内部类 去实现;简化代码,提供开发的效率;
 动态代理的使用场景:
public static void main (String[] args) {
//向下转型;创建的对象会实现传入的接口 Animal newProxyInstance = (Animal) Proxy.newProxyInstance(
//类加载器Text.class.getClassLoader(),//放入要实现的接口new Class[]{Animal.class},//执行处理器,给一个匿名内部类执行接口的方法;new InvocationHandler() {@Override//代理对象调用任何方法都会执行involve方法;public Object invoke (Object proxy, Method method, Object[] args) throws Throwable {return null;}}
);
//使用代理对象调用接口中的方法; newProxyInstance.setText1();
}
}
//接口: public interface Animal {
void setText1();void setText2();void setText3();
}
<a name="rdQiO"></a>## 5,动态代理模式对ArrayList的增强与拦截范例:```javapublic class Text {public static void main (String[] args) {//创建真实对象listArrayList <String> list = new ArrayList <>();//向下转型;创建的对象会实现传入的接口//移除所有黄色警告@SuppressWarnings ("all")List <String> newProxyInstance = (List <String>) Proxy.newProxyInstance(//类加载器Text.class.getClassLoader(),//实现的接口new Class[]{List.class},new InvocationHandler() {@Override//代理对象调用任何方法都会执行involve方法;public Object invoke (Object proxy, Method method, Object[] args) throws Throwable {//对方法进行拦截;if (method.getName().equals("remove")) {return null;} else {//对功能进行增强//输出时间Date date = new Date();SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");simpleDateFormat.format(date);//利用真实对象list调用方法//外面调用什么方法就要用什么方法;方法名通过args传入Object invoke = method.invoke(list, args);//要返回一个与方法返回值对应的返回值类型return invoke;}}});//使用代理对象调用接口中的方法;newProxyInstance.add("等待");}}//接口:public interface List<T> {void add(String name);void remove(String a);void setText3();}
