Proxy(Java提供的用于生成动态代理对象的类)
实现步骤:
a.让被代理对象和代理对象实现相同的接口
b.在代理对象中保存被代理对象的引用
c.代理对象重写接口的方法,如果增删改相关方法,直接抛出异常,如果查询方法调用被代理对象的方法操作即可!
Proxy(Java提供的用于生成动态代理对象的类) //动态生成一个类的代理类的对象 public static Object newProxyInstance( ClassLoader loader, //参数1,称为类加载,给当前类的类加载器即可,当前类名.class.getClassLoader() Class[] classes, //参数2,给代理类和被代理类要共同实现的接口的字节码文件, 被代理对象.getClass().getInterfaces() InvocationHandler handler //参数3.处理实现类对象 ); 接口InvocationHandler的抽象方法: //处理方法,拦截方法 public Object invoke(Object proxy, Method method, Object[] args); 代理对象 被懒拦截主方法对象 前面这个方法的参数
案例
//1.创建一个集合 ArrayList<String> arr = new ArrayList<String>(); //2.保存一些重要信息 arr.add("jack"); arr.add("13838385438"); arr.add("北京市顺义区xx路"); //拦截方法,当我们调用arrProxy代理对象的任务方法时,都会被拦截住 List<String> arrProxy = (List<String>) Proxy.newProxyInstance( ProxyTest.class.getClassLoader(), //类加载器 arr.getClass().getInterfaces(), //接口的字节码文件数组 (proxy, method, args1) -> { // System.out.println("被拦截的方法:" + method.getName()); // System.out.println("方法参数:" + Arrays.toString(args)); //如果和get有关方法,就调用真实对象的方法 String name = method.getName(); if (name.startsWith("get")) { //如果和get有关方法,就调用真实对象的方法 return method.invoke(arr, args1); } else { //如果其他方法,直接抛出异常 throw new UnsupportedOperationException("方法" + name + "不支持..."); } } );