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;
    }

 

posted @ 2020-07-07 17:33  一半人生  阅读(257)  评论(0编辑  收藏  举报