概述
动态代理就是直接通过反射生成一个代理对象,代理对象所属的类是不需要存在的。代理的是接口(Interfaces),不是类(Class),也不是抽象类。Java.lang.reflect.Proxy类可以直接给实现接口类的对象直接生成代理对象
优点
可以很方便的对代理类的函数进行统一的处理,而不用修改每个代理类中的方法。因为只要在接口的invoke方法中统一处理,就可以对所有被代理的方法进行相同的操作了
步骤
1、接口A 包含了需要执行的方法
2、类B 是接口A的实现类,原本要由它的对象来执行操作,现在要代理类代理B的对象执行操作。执行的地点,可以是这个类中,也可以是其他类中
3、创建代理类对象:
Proxy.newProxyInstance(ClassLoader 被代理对象的类加载器 , Class<?>[] 被代理类所有实现的接口的Class对象, InvocationHandler 执行处理接口)
返回一个代理对象,前2个参数是为了帮助在jvm内部生成被代理对象的代理对象,第3个参数,动态代理方法在执行时,会调用拦截器InvocationHandler(调用处理器)中的invoke方法去执行。返回值要用它的接口类来接受代理对象,因为不能确定代理类的具体类型
4、重写 InvocationHandler接口中的
Object invoke(Object 生成的代理对象, Method 当前执行的方法, Object[] 当前执行方法时传递的参数)
所有执行代理对象的方法都会被替换成执行该接口的invoke方法,在接口的invoke方法中,我们通过调用该方法的参数method的invoke方法来执行被代理对象的原操作。在代理过程中,我们在真正执行被代理对象的方法之前或之后的位置加入自己其他处理。
回调方法: 代理对象调用任何方法,就会来执行该invoke方法, 在该方法中就可以增强被代理类的方法,返回值:当前方法执行的返回值
示例
/* 需求:对List接口进行代理,以前的remove(Object obj)方法是删除集合中第一次出现的元素,
代理后,要求在调用remove(Object obj)方法后,能够删除集合中所有匹配的元素。 */
ArrayList<String> list = new ArrayList<>();// 被代理类
list.add("a"); list.add("b"); list.add("a");
List<String> proxy = (List<String>)Proxy.newProxyInstance(list.getClass().getClassLoader(),ArrayList.class.getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object res = method.invoke(list, args);
if (method.getName().equals("remove")){
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String e = it.next();
if (e.equals(args[0])){// false
it.remove();
} } }
return res;
} });
boolean res = proxy.remove("a");
希望我的学习笔记能帮到你!加油!
欢迎点赞收藏和评论!*✧⁺˚⁺ପ(๑・ω・)੭ु⁾⁾