实战中反射的应用

简介: 实战中反射的应用

image.png

1.概念

反射 是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection  APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static  等等)、superclass(例如Object)、实现之interfaces(例如Serializable),也包括fields和methods的所有信息,并可于运行时改变fields内容或调用methods。

一般而言,开发者社群说到动态语言,大致认同的一个定义是:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。

尽管在这样的定义与分类下Java不是动态语言,它却有着一个非常突出的动态相关机制:Reflection。这个字的意思是“反射、映象、倒影”,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。这种“看透class”的能力(the  ability of the program to examine  itself)被称为introspection(内省、内观、反省)。Reflection和introspection是常被并提的两个术语。

用白话讲 反射 能够获取java类在运行过程中(class文件)的对象,方法,成员变量。

ps:反射能获取private方法,楼主面试常问。

2.名词解析

  • Class类:代表一个类
  • Field类:代表类的成员变量
  • Method类:代表类的方法
  • Constructor类:代表类的构造方法
  • Array类:提供了动态创建数组,以及访问数组的元素的静态方法

3.常用操作

1.获取类的变量

public Object getProperty(Object object, String fieldName) throws Exception {  
     Class class = object.getClass();  //得到该类的Class。
     Field field = class .getField(fieldName);  //获取声明属性
     Object property = field.get(object);  //获取类属性
     return property;  
} 

2.获取类的静态变量

public Object getStaticProperty(String className, String fieldName)  
             throws Exception {  
     Class class = Class.forName(className);  //获取类的Class
     Field field = class.getField(fieldName);   //获取声明的属性
     Object property = field.get(Class);  获取静态属性
     return property;  
}  

3.执行类的方法

public Object invokeMethod(Object object, String methodName, Object[] args) throws Exception {  
     Class Class = object.getClass();   //获取class对象
     Class[] argsClass = new Class[args.length];    //获取参数
     for (int i = 0, j = args.length; i < j; i++) {  
         argsClass[i] = args[i].getClass();  
     }  
     Method method = class.getMethod(methodName,argsClass);   //获取方法
     return method.invoke(object, args);      //通过发射调用方法
}   

4.执行类的静态方法

public Object invokeStaticMethod(String className, String methodName,  
             Object[] args) throws Exception {  
     Class Class = Class.forName(className);  //获取class
     Class[] argsClass = new Class[args.length];  
     for (int i = 0, j = args.length; i < j; i++) {  
         argsClass[i] = args[i].getClass();  
     }  //获取参数
     Method method = class.getMethod(methodName,argsClass);  //获取方法
     return method.invoke(null, args);   //通过反射执行
 }  

5.新建实例

public Object newInstance(String className, Object[] args) throws Exception {  
     Class class = Class.forName(className); //获取class 
     Class[] argsClass = new Class[args.length];   
     for (int i = 0, j = args.length; i < j; i++) {  
         argsClass[i] = args[i].getClass();  
     }  //获取参数
     Constructor cons = class.getConstructor(argsClass);  //获取构造方法
     return cons.newInstance(args);  //新建实例
}  

6.判断是否是指定类

public boolean isInstance(Object obj, Class cls) {  
     return cls.isInstance(obj);  
}  

7.获取数组属性

public Object getByArray(Object array, int index) {  
     return Array.get(array,index);  
}  


相关文章
|
机器学习/深度学习 人工智能 JSON
【实战干货】AI大模型工程应用于车联网场景的实战总结
本文介绍了图像生成技术在AIGC领域的发展历程、关键技术和当前趋势,以及这些技术如何应用于新能源汽车行业的车联网服务中。
1612 94
|
9天前
|
人工智能 JSON 供应链
畅用7个月无影 JVS Claw |手把手教你把JVS改造成「科研与产业地理情报可视化大师」
LucianaiB分享零成本畅用JVS Claw教程(学生认证享7个月使用权),并开源GeoMind项目——将JVS改造为科研与产业地理情报可视化AI助手,支持飞书文档解析、地理编码与腾讯地图可视化,助力产业关系图谱构建。
23436 10
畅用7个月无影 JVS Claw |手把手教你把JVS改造成「科研与产业地理情报可视化大师」
|
13天前
|
人工智能 缓存 BI
Claude Code + DeepSeek V4-Pro 真实评测:除了贵,没别的毛病
JeecgBoot AI专题研究 把 Claude Code 接入 DeepSeek V4Pro,跑完 Skills —— OA 审批、大屏、报表、部署 5 大实战场景后的真实体验 ![](https://oscimg.oschina.net/oscnet/up608d34aeb6bafc47f
4600 15
Claude Code + DeepSeek V4-Pro 真实评测:除了贵,没别的毛病
|
14天前
|
人工智能 JSON BI
DeepSeek V4 来了!超越 Claude Sonnet 4.5,赶紧对接 Claude Code 体验一把
JeecgBoot AI专题研究 把 Claude Code 接入 DeepSeek V4Pro 的真实体验与避坑记录 本文记录我将 Claude Code 对接 DeepSeek 最新模型(V4Pro)后的真实体验,测试了 Skills 自动化查询和积木报表 AI 建表两个场景——有惊喜,也踩
5515 13
|
1月前
|
人工智能 自然语言处理 安全
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
本文介绍了Claude Code终端AI助手的使用指南,主要内容包括:1)常用命令如版本查看、项目启动和更新;2)三种工作模式切换及界面说明;3)核心功能指令速查表,包含初始化、压缩对话、清除历史等操作;4)详细解析了/init、/help、/clear、/compact、/memory等关键命令的使用场景和语法。文章通过丰富的界面截图和场景示例,帮助开发者快速掌握如何通过命令行和交互界面高效使用Claude Code进行项目开发,特别强调了CLAUDE.md文件作为项目知识库的核心作用。
24443 65
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
|
2天前
|
前端开发 API 内存技术
对比claude code等编程cli工具与deepseek v4的适配情况
DeepSeek V4发布后,多家编程工具因未适配其强制要求的`reasoning_content`字段而报错。本文对比Claude Code、GitHub Copilot、Langcli、OpenCode及DeepSeek-TUI等主流工具的兼容性:Claude Code需按官方方式配置;Langcli表现最佳,开箱即用且无报错;Copilot与OpenCode暂未修复问题;DeepSeek-TUI尚处早期阶段。
675 2
对比claude code等编程cli工具与deepseek v4的适配情况