• jdk动态代理失效,事务自调用失效


    1、jdk动态代理失效

      接口

    public interface UserDao {
        void add();
        void delete();
        void update();
        void find();
    }

      实现类

    public class UserDaoImpl implements UserDao {
    
        @Override
        public void add() {
            System.out.println("this: " + this); // com.oy.demo.UserDaoImpl@6bc7c054
            System.out.println("this: " + this.getClass().getName()); // com.oy.demo.UserDaoImpl
            this.find(); // 这里通过this调用find()方法, find()方法代理失效
            System.out.println("添加。。。");
        }
    
        @Override
        public void delete() {
            System.out.println("删除。。。");
        }
    
        @Override
        public void update() {
            System.out.println("修改。。。");
        }
    
        @Override
        public void find() {
            System.out.println("查询。。。");
        }
        
    //    @Override
    //    public String toString() {
    //        System.out.println("UserDaoImpl#toString()");
    //        return "UserDaoImpl#toString()";
    //    }
    
    }

       测试:jdk动态代理失效

    public static void main(String[] args) {
        final UserDao userDao = new UserDaoImpl();
    
        UserDao proxyUserDao = (UserDao) Proxy.newProxyInstance(userDao.getClass().getClassLoader(),
                userDao.getClass().getInterfaces(), new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        // System.out.println(proxy.getClass().getName()); // com.sun.proxy.$Proxy0
                        System.out.println("权限校验");
                        Object result = method.invoke(userDao, args);
                        System.out.println("日志记录");
                        return result;
                    }
                });
    
        System.out.println("动态代理对象的类型:" + proxyUserDao.getClass().getName()); // 动态代理对象的类型:com.sun.proxy.$Proxy0
        //System.out.println("动态代理对象:" + proxyUserDao.toString()); // toString也被代理了
        
        proxyUserDao.add();
    }

      打印结果:

    动态代理对象的类型:com.sun.proxy.$Proxy0
    权限校验
    this: com.oy.demo.UserDaoImpl@6bc7c054
    this: com.oy.demo.UserDaoImpl
    查询。。。
    添加。。。
    日志记录

      分析:proxyUserDao.add() 方法调用了this.find() 方法, find()方法代理失效。

    2、事务自调用失效

    ---

  • 相关阅读:
    [Java] 理解JVM之二:类加载步骤及内存分配
    [Java] 理解JVM之三:垃圾回收机制
    [Java] I/O底层原理之一:字符流、字节流及其源码分析
    [Java] 集合框架原理之二:锁、原子更新、线程池及并发集合
    [Web] Web请求过程之一:HTTP
    [Web] Web请求过程之二:DNS 域名解析
    [Java] 集合框架原理之一:基本结构与源码分析
    Hello World
    c++数据结构图论创建一个导航图,实现基本功能
    jquery1.9: unrecognized expression: a[@href=
  • 原文地址:https://www.cnblogs.com/xy-ouyang/p/14668814.html
Copyright © 2020-2023  润新知