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)),生成代理类对象

原文地址:https://www.cnblogs.com/ssl-bl/p/11043243.html