Java反射1

反射

反射允许对成员变量、成员方法和构造方法的信息进行编程访问。简单来说就是获取类里所有的信息。IDEA里自动提示的功能就是通过反射实现的。

获取class对象的三种方式

1.Class.forName("全类名")

2.类名.class

3.对象.getclass()

这三种方式对应Java当中三个不同的阶段。如果我们想创建一个类对象,分为以下三个阶段:

1.编写.java文件,并将其编译为.class字节码文件。在这个阶段代码没有被加载到内存中,只是在硬盘上进行操作。这个阶段是源代码阶段。源代码阶段使用第一种方式获取class对象

2.接下来要运行代码。将.class字节码文件加载到内存当中。这个阶段是加载阶段。加载阶段使用第二种方式

3.我们可以在内存中new一个对象,这个阶段是运行阶段。运行阶段使用第三种方式。

public class ReflectionDemo1 { public static void main(String[] args) throws ClassNotFoundException { //1.第一种方式 //全类名:包名+类名,选中类名,右键找到复制/粘贴特殊,点击复制引用 //最为常用 Class Clazz1 = Class.forName("learn.reflection.Student"); ​ //打印 System.out.println(Clazz1); ​ //2.第二种方式,一般更多的是当作参数进行传递 Class Clazz2 = Student.class; ​ //验证 System.out.println(Clazz1 == Clazz2); ​ //3.第三种方式 //当我们已经有了这个类的对象时才能使用 Student stu = new Student(); Class Clazz3 = stu.getClass(); ​ //验证 System.out.println(Clazz1 == Clazz2); System.out.println(Clazz2 == Clazz3); } }
利用反射获取构造方法

Class类中用于获取构造方法的方法:

方法名称说明
Constructor<?>[] getConstructors()返回所有公共构造方法对象的数组
Constructor<?>[] getDeclaredConstructors()返回所有构造方法对象的数组
Constructor<T>getConstructor(Class<?>...parameterTypes)返回单个公共构造方法对象
Constructor<T>getDeclaredConstructor(Class<?>...parameterTypes)返回单个构造方法对象

Constructor类中用于创建对象的方法

方法名称说明
T newInstance(Object...initargs)根据指定的构造方法创建对象
setAccessible(boolean flag)设置为true,表示取消访问检查

新增几个构造函数:

public class Student { private String name; private int age; ​ public Student() { } ​ public Student(String name) { this.name = name; } ​ protected Student(int age) { this.age = age; } ​ private Student(String name, int age) { this.name = name; this.age = age; } ​ public String getName() { return name; } ​ public void setName(String name) { this.name = name; } ​ public int getAge() { return age; } ​ public void setAge(int age) { this.age = age; } ​ @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
public class ReflectionDemo1 { public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException { //1.获取Student类的class字节码文件对象 Class clazz = Class.forName("learn.reflection.Student"); ​ //2.获取public构造方法 Constructor[] cons = clazz.getConstructors(); for (Constructor con : cons) { System.out.println(con); } ​ System.out.println("-------------"); ​ //3.获取所有构造方法 Constructor[] dc = clazz.getDeclaredConstructors(); for (Constructor con : dc) { System.out.println(con); } ​ System.out.println("-------------"); ​ //获取单个构造方法:空参构造 System.out.println(clazz.getDeclaredConstructor()); ​ //获取单个构造方法:参数为一个String类型变量的构造函数 //括号中的参数与想要获得的构造方法的参数对应 System.out.println(clazz.getDeclaredConstructor(String.class)); ​ //获取单个构造方法:参数为一个String类型和一个int类型变量的构造函数 Constructor TempCon = clazz.getDeclaredConstructor(String.class, int.class); System.out.println(TempCon); ​ System.out.println("-------------"); ​ //获取权限修饰符:.getModifiers方法 //public为1,private为2,protected为4 //static为8,final为16,synchronized为32 //用的都是2的n次幂 System.out.println(TempCon.getModifiers()); ​ System.out.println("-------------"); ​ //获取参数 Parameter[] parameters = TempCon.getParameters(); for (Parameter parameter : parameters) { System.out.println(parameter); } ​ System.out.println("-------------"); ​ //通过反射创建对象 //由于两个参数的构造方法为priavte //要先临时取消权限校验 TempCon.setAccessible(true); Student stu = (Student) TempCon.newInstance("张三",18); System.out.println(stu); } }
利用反射获取成员变量

Class类中用于获取成员变量的方法

方法名称说明
Field[] getFields()返回所有公共成员变量对象的数组
Field[] getDeclaredFields()返回所有成员变量对象的数组
Field getField(String name)返回单个公共成员变量对象
Field getDeclaredField(String name)返回单个成员变量对象

Field类中用于创建对象的方法

方法名称说明
void set(Object obj, Object value)赋值
Object get(Object obj)获取值

修改Student类的内容:

public class Student { private String name; private int age; public String gender; ​ public Student(String name, int age, String gender) { this.name = name; this.age = age; this.gender = gender; } ​ public Student() { } ​ public String getName() { return name; } ​ public void setName(String name) { this.name = name; } ​ public int getAge() { return age; } ​ public void setAge(int age) { this.age = age; } ​ public String getGender() { return gender; } ​ public void setGender(String gender) { this.gender = gender; } ​ @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + ", gender='" + gender + '\'' + '}'; } }
public class ReflectionDemo1 { public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchFieldException { //1.获取Student类的class字节码文件对象 Class clazz = Class.forName("learn.reflection.Student"); ​ //2.获取public成员变量 Field[] fields1 = clazz.getFields(); ​ for (Field field : fields1) { System.out.println(field); } ​ System.out.println("-------------"); ​ //3.获取所有成员变量 Field[] fields2 = clazz.getDeclaredFields(); ​ for (Field field : fields2) { System.out.println(field); } ​ System.out.println("-------------"); ​ //4.获取单个的成员变量 Field name = clazz.getDeclaredField("name"); System.out.println(name); ​ System.out.println("-------------"); ​ //5.获取权限修饰符 System.out.println(name.getModifiers()); ​ System.out.println("-------------"); ​ //6.获取成员变量名 System.out.println(name.getName()); ​ System.out.println("-------------"); ​ //7.获取成员变量类型 System.out.println(name.getType()); ​ System.out.println("-------------"); ​ //8.获取成员变量记录的值 Student s = new Student("张三",18,"男"); name.setAccessible(true); Object value = name.get(s); System.out.println(value); ​ System.out.println("-------------"); ​ //9.修改对象记录的值 name.set(s,"凯文"); System.out.println(s); } }
利用反射获取成员方法

方法名与前面类似,改成Method而已。

有几点需要注意:

1.getMethods方法可以获取所有public的方法对象,包括父类中所有的public方法。getDeclaredMethods则不能获取父类的,但可以获取私有的(和前面一样)

2.获取方法抛出的异常:

Class[] exceptionTypes = m.getExceptionTypes(); for (Class exceptionType : exceptionTypes) { System.out.println(exceptionType); }

3.方法运行

Student s = new Student(); clazz.getMethod("eat", String.class).invoke(s,"汉堡");

invoke第一个参数表示方法的调用者,第二个参数表示在调用方法的时候传递的实际参数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1151922.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI骨骼关键点检测优化实战:MediaPipe Pose推理加速

AI骨骼关键点检测优化实战&#xff1a;MediaPipe Pose推理加速 1. 引言&#xff1a;AI人体骨骼关键点检测的工程挑战 随着计算机视觉技术的发展&#xff0c;人体姿态估计&#xff08;Human Pose Estimation&#xff09;已成为智能健身、动作捕捉、虚拟试衣、人机交互等场景的…

从零开始:AI人体骨骼关键点检测WebUI搭建完整指南

从零开始&#xff1a;AI人体骨骼关键点检测WebUI搭建完整指南 1. 学习目标与背景介绍 1.1 为什么需要人体骨骼关键点检测&#xff1f; 在计算机视觉领域&#xff0c;人体姿态估计&#xff08;Human Pose Estimation&#xff09;是一项基础且极具实用价值的技术。它能够从一张…

3分钟掌握RePKG:解锁Wallpaper Engine壁纸资源的终极指南

3分钟掌握RePKG&#xff1a;解锁Wallpaper Engine壁纸资源的终极指南 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg RePKG是一款专为Wallpaper Engine设计的开源工具&#xff0c;能…

MediaPipe Pose实战:舞蹈动作识别教程

MediaPipe Pose实战&#xff1a;舞蹈动作识别教程 1. 引言 1.1 AI 人体骨骼关键点检测的兴起 随着计算机视觉技术的飞速发展&#xff0c;人体姿态估计&#xff08;Human Pose Estimation&#xff09;已成为AI在运动分析、虚拟现实、智能健身和人机交互等领域的重要基础能力。…

AI骨骼检测为何选MediaPipe?轻量高稳模型对比评测

AI骨骼检测为何选MediaPipe&#xff1f;轻量高稳模型对比评测 1. 引言&#xff1a;AI人体骨骼关键点检测的技术背景与选型挑战 在计算机视觉领域&#xff0c;人体骨骼关键点检测&#xff08;Human Pose Estimation&#xff09;是理解人类行为的基础能力之一。它通过识别图像中…

MediaPipe Pose保姆级教程:人体姿态估计从入门到精通

MediaPipe Pose保姆级教程&#xff1a;人体姿态估计从入门到精通 1. 引言&#xff1a;AI 人体骨骼关键点检测的现实价值 随着计算机视觉技术的飞速发展&#xff0c;人体姿态估计&#xff08;Human Pose Estimation&#xff09;已成为智能健身、动作捕捉、虚拟试衣、人机交互等…

MediaPipe本地化优势揭秘:AI姿态识别安全稳定部署案例

MediaPipe本地化优势揭秘&#xff1a;AI姿态识别安全稳定部署案例 1. 引言&#xff1a;为何选择本地化AI姿态识别&#xff1f; 随着人工智能在健身指导、虚拟试衣、动作捕捉等领域的广泛应用&#xff0c;人体骨骼关键点检测&#xff08;Human Pose Estimation&#xff09;已成…

基于 vLLM 的大模型推理服务秒级扩缩容的工程优化实践

大模型推理服务在规模化落地过程中&#xff0c;面对流量突发、模型切换与节点故障等场景&#xff0c;如何实现秒级扩缩容与快速恢复&#xff0c;成为决定在线推理服务快速响应和长稳运行的关键挑战。在 Qwen3-235B-A22B 等超大模型的推理服务实践中&#xff0c;百度智能云混合云…

MediaPipe Pose模型压缩:轻量化部署教程

MediaPipe Pose模型压缩&#xff1a;轻量化部署教程 1. 引言&#xff1a;AI 人体骨骼关键点检测的工程挑战 随着智能健身、虚拟试衣、动作捕捉等应用的兴起&#xff0c;人体骨骼关键点检测&#xff08;Human Pose Estimation&#xff09;已成为计算机视觉中的核心任务之一。其…

MediaPipe与TensorFlow Lite结合部署:轻量化姿态识别完整流程

MediaPipe与TensorFlow Lite结合部署&#xff1a;轻量化姿态识别完整流程 1. 引言&#xff1a;AI人体骨骼关键点检测的轻量化实践 随着智能健身、虚拟试衣、动作捕捉等应用场景的兴起&#xff0c;人体姿态估计&#xff08;Human Pose Estimation&#xff09;已成为计算机视觉…

企业级解决方案:HY-MT1.5-1.8B在客服系统中的实战应用

企业级解决方案&#xff1a;HY-MT1.5-1.8B在客服系统中的实战应用 随着全球化业务的不断扩展&#xff0c;多语言客户服务已成为企业提升用户体验、拓展国际市场的重要手段。然而&#xff0c;传统翻译服务在响应速度、术语一致性、上下文理解等方面存在明显短板&#xff0c;难以…

零基础掌握Multisim模拟电路图标配置方法

零基础也能上手&#xff1a;Multisim模拟电路元件配置全攻略你是不是刚打开 Multisim&#xff0c;面对满屏的“Place Component”窗口一脸懵&#xff1f;想找一个 LM358 运放&#xff0c;翻了半天却只看到一堆英文分类&#xff1b;想搭个简单的放大电路&#xff0c;结果仿真出来…

AI骨骼关键点检测实测报告:复杂光照下的表现分析

AI骨骼关键点检测实测报告&#xff1a;复杂光照下的表现分析 1. 引言&#xff1a;AI人体骨骼关键点检测的现实挑战 随着计算机视觉技术的快速发展&#xff0c;AI人体骨骼关键点检测已成为智能健身、动作捕捉、虚拟试衣、安防监控等多个领域的核心技术。其核心任务是从单张RGB…

哔哩下载姬Downkyi完全指南:轻松下载B站8K超高清视频

哔哩下载姬Downkyi完全指南&#xff1a;轻松下载B站8K超高清视频 【免费下载链接】downkyi 哔哩下载姬downkyi&#xff0c;哔哩哔哩网站视频下载工具&#xff0c;支持批量下载&#xff0c;支持8K、HDR、杜比视界&#xff0c;提供工具箱&#xff08;音视频提取、去水印等&#x…

VHDL语言基础篇:数据类型与端口模式系统学习

深入理解VHDL&#xff1a;从数据类型到端口模式的实战解析你有没有在写VHDL代码时&#xff0c;遇到过这样的困惑&#xff1f;明明逻辑看起来没问题&#xff0c;仿真也通过了&#xff0c;结果综合后功能异常——信号悬空、总线冲突、状态机跳转错乱……最后排查半天&#xff0c;…

AI骨骼检测教程:MediaPipe Pose可视化输出

AI骨骼检测教程&#xff1a;MediaPipe Pose可视化输出 1. 章节概述 随着人工智能在计算机视觉领域的深入发展&#xff0c;人体姿态估计&#xff08;Human Pose Estimation&#xff09;已成为智能健身、动作捕捉、虚拟试衣、人机交互等场景的核心技术之一。其中&#xff0c;如…

LeagueAkari:英雄联盟玩家的5大智能辅助功能完全指南

LeagueAkari&#xff1a;英雄联盟玩家的5大智能辅助功能完全指南 【免费下载链接】LeagueAkari ✨兴趣使然的&#xff0c;功能全面的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/LeagueAkari LeagueAka…

LeaguePrank:英雄联盟段位展示工具完整使用指南

LeaguePrank&#xff1a;英雄联盟段位展示工具完整使用指南 【免费下载链接】LeaguePrank 项目地址: https://gitcode.com/gh_mirrors/le/LeaguePrank LeaguePrank是一款专业的英雄联盟段位修改工具&#xff0c;通过LCU API接口实现游戏数据的个性化展示。该项目采用C …

通俗解释Intel南桥对USB 3.0 3.1 3.2的支持

一块南桥芯片&#xff0c;如何决定你的U盘能跑多快&#xff1f;——深度拆解Intel平台对USB 3.0/3.1/3.2的支持真相 你有没有过这样的经历&#xff1a;花大价钱买了个“支持USB 3.2”的移动固态硬盘&#xff0c;插在主板后置接口上&#xff0c;结果测速只有400MB/s出头&#xf…

USB接口类型全解析:新手入门必看指南

一根线的进化史&#xff1a;从USB-A到USB-C&#xff0c;看懂接口背后的硬核逻辑 你有没有过这样的经历&#xff1f; 手握一根“看起来能插”的USB线&#xff0c;在电脑、充电头、手机之间反复翻转尝试&#xff0c;最后发现——还是插不进去。 或者刚买的新显示器&#xff0c;…