jdk的动态代理的api实现,扩展cglib代理
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 + "不支持..."); } } );
扩展 cglib
public Object getProxyObj(Object targetObj) { /** * Enhancer.create(两个参数); * 参数1: 类的字节码对象 * 参数2: 方法的拦截器 */ //参数1: 类的字节码对象 Class<?> objClass = targetObj.getClass(); //参数2: 方法的拦截器 MethodInterceptor methodInterceptor = new MethodInterceptor() { @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { //invokeResult执行方法后的返回值 Object invokeResult = null; try { //实现事务控制功能 //开启事务 transactionManager.beginTransaction(); //实现方法放行 invokeResult = method.invoke(targetObj, args); //提交事务 transactionManager.commit(); } catch (Exception e) { e.printStackTrace(); //回滚事务 transactionManager.rollback(); } finally { //释放资源 transactionManager.close(); } return invokeResult; } }; Object proxy = Enhancer.create(objClass, methodInterceptor); //相当于Proxy.newInstance(三个参数) return proxy; }