jdk动态代理

    xiaoxiao2022-07-07  197

    jdk动态代理:

    java的动态代理

    ​ jdk动态代理: 只能对实现接口的类产生daim

    ​ Cglib动态代理:对没有实现接口的类产生代理,生成子类  *

    代理模式 (概念)   代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处 理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。  代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的 对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提  供特定的服务。个人理解: jdk动态代理到底干了个什么事:自己已经编写好的类交给动态代理,在动态代理中执行代理方法可以添加一个额外的操作,比如给已完成差不多的项目再添加权限操作! 动态代理在后期方便对代码添加方法和去除不用改动过多的代码

    1.创建代理creatProxy()

    public UserDao creatProxy() {

    UserDao userDaoProxy = (UserDao) Proxy.newProxyInstance(

    ​ userDao.getClass().getClassLoader(), //类加载器 定义由那个类加载器加载 ​ userDao.getClass().getInterfaces(),接口 给将要代理我俩的对象提供一组什么样的接口

    ​ this //当前代理对象调用的方法);

    ​ return userDaoProxy;

    }

    **2.创建接口 —>**当前代理对象调用的方法 implements InvocationHandler

    然后在该接口的方法中执行判断是否增强需要增强的方法

    public Object invoke(Object arg0, Method arg1, Object[] arg2) throws Throwable { ​ if(“save”.equals(arg1.getName())) { ​ //增强 ​ System.out.println(arg1.getName()+“已经增强!”); ​ return arg1.invoke(userDao, arg2); ​ }else { ​ System.out.println(arg1.getName()+“没有增强!”); ​ return arg1.invoke(userDao, arg2); ​ } ​ }

    InvocationHandler接口:proxy代理实例的调用处理程序实现的一个接口,每一个proxy代理实例都 有一个关联的调用处理程序;在代理实例调用方法时,方法调用被编码分派到调用处理程序的invoke方法。

    Proxy.newProxyInstance()方法中三个参数的解释:

    Proxy类就是用来创建一个代理对象的类,它提供了很多方法,但是我们最常用的是newProxyInstance方法。

    这个方法的作用就是创建一个代理类对象,它接收三个参数,我们来看下几个参数的含义:

    ​ classloader: 定义了由哪个classloader(类加载器){当前对象的加载器}对象对生成的代理类进行加载 ​ interfaces:一个interface对象数组,{当前对象的所有接口}表示我们将要给我们的代理对象提供一组什么样的接口,如果我们提供了这样一个接口对象数组,那么也就是声明了代理类实现了这些接口,代理类就可以调用接口中声明的所有方法。

    ​ InvocationHandler(this):一个InvocationHandler对象,表示的是当动态代理对象调用方法的时候会关联到哪一个InvocationHandler对象上,并最终由其调用。

    最新回复(0)