• java面试-java动态代理和cglib代理


      代理模式就是为了提供额外或不同的操作,而插入的用来替代实际对象的对象,这些操作涉及到与实际对象的通信,因此代理通常充当中间人角色

    一、java动态代理

      java动态代理可以动态地创建代理并动态地处理对所代理方法的调用。在动态代理上所做的所有调用都会被重定向到单一的调用处理器上。

    1、使用动态代理的五大步骤

    (1)编写接口类和实现类
    public interface UserDao {
        void addUser(String var1);
    }
    
    public class UserDaoImpl implements UserDao{
        @Override
        public void addUser(String userName) {
            System.out.println("添加用户"+userName);
        }
    }
    
    (2)通过实现InvocationHandler接口来自定义自己的InvocationHandler(主要是编写invoke方法)
    public class LogHandler implements InvocationHandler {
        private Object target;
        public LogHandler(Object target){
            this.target = target;
        }
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("开始记录日志");
            method.invoke(target,args);
            System.out.println("结束记录日志");
            return null;
        }
    }
    
    (3)使用Proxy.newProxyInstance方法创建代理对象并执行方法
            UserDao userDao = new UserDaoImpl();
            //构造函数中传入实际对象
            LogHandler logHandler = new LogHandler(userDao);
            UserDao userDAOProxy = (UserDao) Proxy.newProxyInstance(userDao.getClass().getClassLoader(),
                    userDao.getClass().getInterfaces(),logHandler);
            userDAOProxy.addUser("aaa");
    

    2、java动态代理的原理解析

      java动态代理的核心是Proxy.newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)。用于生成代理对象。
      ClassLoader loader:用来指明生成代理对象使用哪个类装载器。
      Class<?>[] interfaces:用来指明生成哪个对象的代理对象(代理类和目标类需要实现相同的接口)
      InvocationHandler h:最后会调用到我们自定义的方法中。

    3、newProxyInstance方法生成代理对象过程

      (1)通过Proxy.getProxyClass(ProxyGenerator.generateProxyClass(proxyName, interfaces))获得动态代理类的class字节码内容。
      (2)把字节码通过传入的类加载器加载到虚拟机中,然后通过反射机制获得代理类的构造方法(方法签名为getConstructor(InvocationHandler.class)),生成代理类对象

  • 相关阅读:
    C语言第四次博客作业嵌套循环
    C语言第六次博客作业数据类型
    C语言第五次博客作业函数
    C语言第二次博客作业分支结构
    MD5 DSA RSA 简单 区别
    关于Linux Grep命令使用的详细介绍
    最好、最智能化、最方便的Java开发软件 IntelliJ IDEA 10.5.2
    Linux Find 命令精通指南
    linux 下面递归查找
    公钥和私钥的解释
  • 原文地址:https://www.cnblogs.com/ssl-bl/p/11043243.html
Copyright © 2020-2023  润新知