当前位置: 首页 > news >正文

Google Guava 反射工具使用详解

文章目录

  • 反射
    • 类操作
    • 方法操作
    • 字段操作
    • 获取注解


反射

在 Guava 中,反射(Reflection)模块提供了一些用于简化反射操作的工具类和方法。通过 Guava 的反射模块,您可以方便地进行类、方法、字段的操作、获取注解信息等。下面详细介绍一些 Guava 反射模块的使用方法和示例。

类操作

  1. 使用 TypeToken 类可以获取类的类型信息,包括泛型类型:

    TypeToken<String> stringToken = TypeToken.of(String.class);
    TypeToken<List<String>> listToken = new TypeToken<List<String>>() {};
    Class<?> stringClass = stringToken.getRawType(); // 获取原始类型,结果为 class java.lang.String
    Type stringType = stringToken.getType(); // 获取类型,结果为 java.lang.String
    Type listType = listToken.getType(); // 获取类型,结果为 java.util.List<java.lang.String>
    

方法操作

  1. 使用 Invokable 类可以调用方法、获取方法的参数和返回值类型等信息:

    Method method = MyService.class.getMethod("myMethod", String.class, int.class);
    Invokable<?, ?> invokable = Invokable.from(method);
    Object result = invokable.invoke(myServiceInstance, "param1", 123); // 调用方法
    Type returnType = invokable.getReturnType().getType(); // 获取返回值类型
    List<TypeToken<?>> parameterTypes = invokable.getParameterTypes(); // 获取参数类型列表
    

字段操作

  1. 使用 FieldReflection 类可以获取和设置字段的值、获取字段的类型等信息:

    Field field = MyService.class.getField("myField");
    Object fieldValue = FieldReflection.getField(field, myServiceInstance); // 获取字段的值
    FieldReflection.setField(field, myServiceInstance, newValue); // 设置字段的值
    Type fieldType = FieldReflection.getFieldType(field).getType(); // 获取字段的类型
    

获取注解

  1. 使用 AnnotationScanner 类可以扫描类或方法上的注解,并获取注解的信息:
    ImmutableList<Class<? extends Annotation>> annotations = ImmutableList.of(MyAnnotation.class);
    AnnotationScanner.scanClasspath(ClasspathHelper.forPackage("com.example")).annotatedWithAny(annotations).forEach(cls -> {MyAnnotation myAnnotation = cls.getAnnotation(MyAnnotation.class);// 处理注解信息});
    

相关文章:

  • Docker容器网络模式
  • Blender学习笔记:小车狂奔动画
  • 安卓8预装可卸载应用
  • [数据结构]HashSet与LinkedHashSet的底层原理学习心得
  • Git 标签管理
  • Jupyter Markdown 插入图片
  • Kettle 安装配置
  • SpringSecurity和JWT实现认证和授权
  • 聊聊logback的ThrowableProxyConverter
  • prometheus基础,结合node_exporter监控节点
  • 【数组】-Lc15-三数之和(排序+for循环+滑动窗口)
  • 详细学习Pyqt5的10种容器(Containers)
  • 【自动化测试】pytest 用例执行中print日志实时输出
  • WEBAPI返回图片显示在VUE前端
  • 设置随机种子保证网络可复现性
  • 【5+】跨webview多页面 触发事件(二)
  • C++类的相互关联
  • C语言笔记(第一章:C语言编程)
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • Fundebug计费标准解释:事件数是如何定义的?
  • gitlab-ci配置详解(一)
  • iOS 系统授权开发
  • javascript 哈希表
  • Java小白进阶笔记(3)-初级面向对象
  • Material Design
  • mysql中InnoDB引擎中页的概念
  • Redis 懒删除(lazy free)简史
  • TypeScript实现数据结构(一)栈,队列,链表
  • 从tcpdump抓包看TCP/IP协议
  • 从输入URL到页面加载发生了什么
  • 多线程 start 和 run 方法到底有什么区别?
  • 猴子数据域名防封接口降低小说被封的风险
  • 解析带emoji和链接的聊天系统消息
  • 你真的知道 == 和 equals 的区别吗?
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 前嗅ForeSpider采集配置界面介绍
  • 《天龙八部3D》Unity技术方案揭秘
  • 阿里云重庆大学大数据训练营落地分享
  • 从如何停掉 Promise 链说起
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • ​虚拟化系列介绍(十)
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • $().each和$.each的区别
  • (06)Hive——正则表达式
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (七)Knockout 创建自定义绑定
  • (转)Sql Server 保留几位小数的两种做法
  • .NET 设计模式—简单工厂(Simple Factory Pattern)
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • .Net的C#语言取月份数值对应的MonthName值
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc