首页 > 其他分享 >动态代理的相关知识点

动态代理的相关知识点

时间:2023-02-10 17:57:03浏览次数:34  
标签:知识点 Object xxx 代理 接口 InvocationHandler 动态 方法

总所周知,两种通用代理:

jdk动态代理、cglib代理

jdk动态代理 (java.lang.reflect.Proxy java.lang.reflect.InvocationHandler)

需要注意,jdk自带的代理只能为接口创建代理类
方法一
1.调用Proxy.getProxyClass()方法获取代理类的Class对象
2.使用InvocationHandler接口创建代理类的处理器
3.通过代理类和InvocationHandler创建代理对象
4.上面已经创建好代理对象了,接着我们就可以使用代理对象了
   Class<xxx接口类>  代理类对象名 =  (Class<xxx接口类>)  Proxy.getProxyClass(xxx接口.class.getClassLoader(), xxx接口.class);
   InvocationHandler invocationHandler = new InvocationHandler() {
      @Override
      public Object invoke(Object proxy, Method method, Object[] args) throws Throwabled {
        xxx操作;
        return xxx;
      }
   };
   xxx接口类  实例名  =  代理类对象名.getConstructor(InvocationHandler.class).newInstance(invocationHandler);
   实例名.x相关方法();
方法二(相对简单)
1.使用InvocationHandler接口创建代理类的处理器
2.使用Proxy类的静态方法newProxyInstance直接创建代理对象
3.使用代理对象
   InvocationHandler invocationHandler = new InvocationHandler() {
      @Override
      public Object invoke(Object proxy, Method method, Object[] args) throws Throwabled {
        xxx操作;
        return xxx;
      }
   };
   xxx接口类  实例名  =  (xxx接口类)Proxy.newProxyInstance(xxx接口.class.getClassLoader(), new Class[]{xxx接口.class}, invocationHandler);
   实例名.x相关方法(); 

当然也可以通过继承InvocationHandller来创建通用的代理处理器,在其中的方法返回时实现代理

由于jdk动态代理只能为接口创建代理,使用具有上限,所以cglib是个好选择

CGLib 代理 (Enhancer MethodInterceptor)

cglib是一个强大、高性能的字节码生成库,它用于在运行时扩展Java类和实现接口;本质上它是通过动态的生成一个子类去覆盖所要代理的类(非final修饰的类和方法)。Enhancer可能是CGLIB中最常用的一个类,和jdk中的Proxy不同的是,Enhancer既能够代理普通的class,也能够代理接口。Enhancer创建一个被代理对象的子类并且拦截所有的方法调用(包括从Object中继承的toString和hashCode方法)。Enhancer不能够拦截final方法,例如Object.getClass()方法,这是由于Java final方法语义决定的。基于同样的道理,Enhancer也不能对final类进行代理操作。

  1.创建Enhancer对象
    Enhancer enhancer = new Enhancer();
  2.通过setSuperClass来设置父类型,即需要给哪个类创建代理类
    enhancer.setSuperclass(被代理的类.class);
  3.设置回调,需实现org.springframeword.cglib.proxy.Callback接口,这里演示使用org.springframework.cglib.proxy.MethodInterceptor,是一个继承了Callback接口的接口
   (拦截所有方法(MethodInterceptor)、拦截所有方法并返回固定值(FixedValue)、直接放行,不做任何操作(NoOp.INSTANCE)、不同的方法使用不同的拦截器(CallbackFilter))
    enhancer.setCallback(new MethodInterceptor() {
            /**
             * 代理对象方法拦截器
             * @param o 代理对象
             * @param method 被代理的类的方法,即Service1中的方法
             * @param objects 调用方法传递的参数
             * @param methodProxy 方法代理对象
             * @return
             * @throws Throwable
             */
            @Override
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                System.out.println("调用方法:" + method);
                //可以调用MethodProxy的invokeSuper调用被代理类的方法
                Object result = methodProxy.invokeSuper(o, objects);
                return result;
            }
        });
   4.获取代理对象,调用enhancer.create方法获取代理对象,返回的是Object,需要强转
     类  代理对象名    =    enhancer.craete();
   5.即可使用代理对象进行方法调用;

标签:知识点,Object,xxx,代理,接口,InvocationHandler,动态,方法
From: https://www.cnblogs.com/kris-cbl/p/17109900.html

相关文章

  • 动态内存的开辟
    c程序的内存分配:执行程序会将程序加载到内存,内存大体上被分为三个区:栈段、堆段、数据段(全局变量和static变量)  栈:局部变量和形式参数会保存在栈区,函数调用完之后,释放......
  • 三维手臂动态matlab仿真,可以灵活控制手指运动
    1.算法描述三维手臂动态matlab仿真,可以灵活控制手指运动 2.仿真效果预览matlab2022a仿真如下: 3.MATLAB核心程序 clc;clear;closeall;warningoff;addp......
  • echarts动态排序柱状图
    链接:https://juejin.cn/post/7149089840850534407<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"/><metahttp-equiv="X-UA-Comp......
  • 如何用Apipost预执行脚本动态修改Query、Body、Header参数
    预执行脚本的作用主要是:编写JS函数等实现复杂计算;变量的打印定义、获取、删除、清空环境变量定义、获取、删除、清空全局变量获取请求参数动态添加、删除一个header请求参数......
  • 297个机器学习彩图知识点(10)
    导读本系列将持续更新20个机器学习的知识点。1.深度学习的动机2.多元逻辑回归3.自然对数4.神经元5.没有免费的午餐6.噪声修正线性单元7.非参数方法......
  • 构建api gateway之 动态插件
    动态插件之前已经拆解细点逐个介绍了tcp、http代理相关核心点,现在介绍一个让apigateway变得很灵活的功能实现:动态插件。由于lua的动态语言特点,我们可以比较方便......
  • 阿里云容器服务 ACK 产品技术动态(202212)
    点击此处即可查看容器服务 ACK 产品详情......
  • 反向代理-YARP
    .NET反向代理-YARP 什么是YARPYARP(另一个反向代理)设计为一个库,提供核心代理功能,你可以根据应用程序的特定需求进行自定义。YARP是使用.NET的基础架构构建在......
  • 面向对象知识点汇总(小白必会)
    目录Python基础之面向对象一、编程思想1、面向过程2、面向对象二、类与对象的创建1、类的语法结构2、定义与调用3、给对象添加独有属性4、对象独有属性修改三、动态、静态......
  • 当2个前端vue配置转发代理的端口都是一样的话,你电脑同时启动2个vue项目,第二个vue项目
    当2个前端vue配置转发代理的端口都是一样的话,你电脑同时启动2个vue项目,第二个vue项目的配置转发代理的端口会变第一个启动的vue项目    第二个启动的跟第一个vu......