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的增强与拦截范例:
```java
public class Text {
public static void main (String[] args) {
//创建真实对象list
ArrayList <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();
}