Java:反射 reflection ( 概念+相关类+使用方法)

文章目录

  • 一、反射(reflection)
    • 1.概念
            • 优点:
            • 缺点
    • 2.反射的相关类
      • 1.Class类
          • 1.**反射机制的起源**
          • 2.获得类相关的方法
          • 3.获得类中属性的相关方法
          • 4.获得类中注解相关的方法
          • 5.获得类中构造器相关的方法
          • 6.获得类中方法相关的方法
      • 2.获取Class对象的三种方法:
            • 1.使用 Class.forName("类的全路径名");
            • 2.使用 .class 方法。
            • 3.使用类对象的 getClass() 方法

一、反射(reflection)


1.概念

  • Java的反射机制是 在运行状态中,可以知道任何一个类的所有属性和方法
  • 可以调用任意一个对象的任意方法和属性
  • 拿到之后就可以进行修改
  • 反射就是动态获取信息、动态调用对象方法的一种功能
优点:
  • 可以获得一个类的所有属性和方法,进行调用、修改。反射运用在很多主流框架
  • 提高灵活性和扩展性,降低耦合
缺点
  • 导致效率降低
  • 可读性差,不好维护

2.反射的相关类

类名用途
Class类代表类的实体,在运行的Java程序中表示类的接口
Field类代表类的成员变量、类的属性
Method类代表类的方法
Constructor类代表类的构造方法

1.Class类

1.反射机制的起源
  • Java文件被编译后会生成.class文件
  • .class文件会被JVM解析成一个对象:java.long.Class
  • 在运行时,每个java文件最终会变成Class类对象的一个实例
  • 通过反射,获取、添加、修改这个类的属性和方法,成为一个动态的类
2.获得类相关的方法
方法用途
getClassLoader()获得类的加载器
getDeclaredClasses()返回一个数组,数组中包含该类中所有类和接口类的对象(包括私有的)
forName(String className)根据类名返回类的对象
newInstance()创建类的实例
getName()获得类的完整路径名字

在这里插入图片描述

  • 获取Class对象,通过newInstans方法创建类的实例
    public static void reflectNewInstance() {        Class<?> classStudent = null;try {classStudent = Class.forName("reflect.Student");//获取Class对象Student student = (Student) classStudent.newInstance();//强转,向下转向System.out.println(student);//Student{name='小明', age=20}} catch (ClassNotFoundException e) {e.printStackTrace();} catch (InstantiationException e) {throw new RuntimeException(e);} catch (IllegalAccessException e) {throw new RuntimeException(e);}  }
  • newInstans方法会抛出 InstantiationException, IllegalAccessException两个异常
  • 方法的返回值是T,被擦除成了Object,所以要进行强制类型转换
3.获得类中属性的相关方法

(以下方法返回值为Field相关)

方法用途
getField(String name)获得某个公有的属性对象
getFields()获得所有公有的属性对象
getDeclaredField(String name)获得某个属性对象
getDeclaredFields()获得所有属性对象
    // 反射私有属性public static void reflectPrivateField() {Class<?> classStudent = null;try {classStudent = Class.forName("reflect.Student");Field field = classStudent.getDeclaredField("name");field.setAccessible(true);//进行确定Student student = (Student) classStudent.newInstance();field.set(student,"王大锤");System.out.println(student);//Student{name='王大锤', age=20}} catch (ClassNotFoundException e) {e.printStackTrace();} catch (NoSuchFieldException e) {throw new RuntimeException(e);} catch (InstantiationException e) {throw new RuntimeException(e);} catch (IllegalAccessException e) {throw new RuntimeException(e);}}
4.获得类中注解相关的方法
方法用途
getAnnotation(Class annotationClass)返回该类中与参数类型匹配的公有注解对象
getAnnotations()返回该类所有的公有注解对象
getDeclaredAnnotation(Class annotationClass)返回该类中与参数类型匹配的所有注解对象
getDeclaredAnnotations()返回该类所有的注解对象
5.获得类中构造器相关的方法

(以下方法返回值为Constructor相关)

方法用途
getConstructor(Class…<?> parameterTypes)获得该类中与参数类型匹配的公有构造方法
getConstructors()获得该类的所有公有构造方法
getDeclaredConstructor(Class…<?> parameterTypes)获得该类中与参数类型匹配的构造方法
getDeclaredConstructors()获得该类所有构造方法

在这里插入图片描述

  • 同理,获得该类中与参数类型匹配的构造方法
  • 要传入对应构造方法中,参数类型的class对象
		  classStudent = Class.forName("reflect.Student");//获取Class对象Constructor<?> constructor = classStudent.getDeclaredConstructor(String.class, int.class);//获得该类中与参数类型匹配的构造方法

在这里插入图片描述

  • 这里是 constructor的newInstance()方法,传入初始化的参数列表
  • 添加对应的异常,并且进行强转
  • 因为是私有的构造方法,所以要调用setAccessible(true)方法,填上true 体现安全性(需要确认)
  • 反射打破了封装机制
 public static void reflectPrivateConstructor()   {      Class<?> classStudent = null;try {classStudent = Class.forName("reflect.Student");//获取Class对象Constructor<?> constructor = classStudent.getDeclaredConstructor(String.class, int.class);//获得该类中与参数类型匹配的构造方法constructor.setAccessible(true);Student student = (Student) constructor.newInstance("小红", 18);//这里是 constructor的newInstance()方法System.out.println(student);//Student{name='小红', age=18}} catch (NoSuchMethodException e) {e.printStackTrace();} catch (ClassNotFoundException e) {throw new RuntimeException(e);} catch (InvocationTargetException e) {} catch (InstantiationException e) {throw new RuntimeException(e);} catch (IllegalAccessException e) {throw new RuntimeException(e);}}
}
6.获得类中方法相关的方法

(以下方法返回值为Method相关)

方法用途
getMethod(String name, Class…<?> parameterTypes)获得该类某个公有的方法
getMethods()获得该类所有公有的方法
getDeclaredMethod(String name, Class…<?> parameterTypes)获得该类某个方法
getDeclaredMethods()获得该类所有方法
    // 反射私有方法public static void reflectPrivateMethod() {Class<?> classStudent = null;try {classStudent = Class.forName("reflect.Student");Method method = classStudent.getDeclaredMethod("function", String.class);method.setAccessible(true);Student student = (Student) classStudent.newInstance();method.invoke(student,"不要吃");//不要吃} catch (ClassNotFoundException e) {e.printStackTrace();} catch (NoSuchMethodException e) {throw new RuntimeException(e);} catch (InstantiationException e) {throw new RuntimeException(e);} catch (IllegalAccessException e) {throw new RuntimeException(e);} catch (InvocationTargetException e) {throw new RuntimeException(e);}}

2.获取Class对象的三种方法:

1.使用 Class.forName(“类的全路径名”);

静态方法,前提是知道类的全路径名。

在这里插入图片描述

        Class<?> C1 = null;try {C1 = Class.forName("reflect.Student");} catch (ClassNotFoundException e) {e.printStackTrace();}
  • forName会抛出 ClassNotFoundException异常, ClassNotFoundException继承于Exception
  • 所以默认是一个受查异常(编译时异常),需要进行处理(JVM/手动抓取)
2.使用 .class 方法。
 Class<Student> C2 = Student.class;

仅适合在编译前就已经明确要操作的 Class

3.使用类对象的 getClass() 方法
        Student student = new Student();Class<? extends Student> C3 = student.getClass();System.out.println(C1 == C2);//trueSystem.out.println(C1 == C3);//true
  • Class对象只存在一个

点击移步博客主页,欢迎光临~

偷cyk的图

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

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

相关文章

剑指Offer题目笔记19(二分查找)

面试题68&#xff1a; 问题&#xff1a; ​ 输入一个排序的整形数组nums和一个目标值t&#xff0c;如果数组nums中包含t&#xff0c;则返回在数组中的下标&#xff0c;否则返回按照顺序插入到数组的下标。 解决方案&#xff1a; ​ 使用二分查找。每次二分查找都选取位于数组…

Days 35 ElfBoard板对Java的支持

Java作为一种功能强大且广泛应用的编程语言&#xff0c;具有广泛的适应性和实用性。在ELF 1开发板上集成Java支持&#xff0c;无疑将赋予嵌入式开发者更广阔的选择空间&#xff0c;今天就为各位小伙伴详细解析如何在ELF 1开发板上成功部署和运行Java环境。 1.拷贝两个压缩包到E…

代码随想录三刷day36

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、力扣416. 分割等和子集二、力扣1049. 最后一块石头的重量 II三、力扣494. 目标和四、力扣474. 一和零 前言 有N件物品和一个最多能背重量为W的背包。第i件物…

国内IP代理手机软件推荐:功能、选择与使用指南

在移动互联网日益普及的今天&#xff0c;手机已经成为我们生活中不可或缺的一部分。而在使用手机上网的过程中&#xff0c;有时我们可能需要改变或隐藏自己的IP地址&#xff0c;以满足特定的网络需求或提高安全性。这时&#xff0c;国内IP代理手机软件便成为了一个重要的工具。…

基于SpringBoot+Vue+Mybatis的408刷题小程序管理端

简介 原始数据&#xff1a;书目信息、章节信息、题目信息、系统菜单、系统角色、系统用户。 主要任务&#xff1a;系统主要采用spring boot作为后端框架&#xff0c;前端使用vueelementUI&#xff0c;为408刷题小程序提供一个方面的管理和维护的任务&#xff0c;主要功能包括…

IS-IS路由

概览&#xff1a; Intermediate System-to-Intermediate System&#xff0c;中间系统到中间系统协议 IS-IS--IGP--链路状态协议--AD值&#xff1a;115 IS--中间系统&#xff08;路由器&#xff09; ES--终端系统&#xff08;PC&#xff09; 在早期IS-IS的开发并不是为了IP…

C语言在线编译器:无需安装,轻松编写C语言程序

C语言在线编译器&#xff1a;无需安装&#xff0c;轻松编写C语言程序 当今&#xff0c;C语言是一种非常流行的编程语言&#xff0c;被广泛用于系统开发、游戏开发等领域。为了方便学习和实践C语言&#xff0c;许多在线编译器应运而生&#xff0c;其中有些还提供了额外的功能&am…

学成在线day06

上传视频&#xff1a; 对文件进行分块 Testpublic void testChunk() throws IOException {File sourceFile new File("d:/ev/20240302_170705.mp4");String chunkPath "d:/ev/chunk/";File chunkFolder new File(chunkPath);if (!chunkFolder.exists(…

Python学习之-正则表达式

目录 前言&#xff1a;1.re.serach1.1例子&#xff1a; 2.re.match2.1示例1&#xff1a;2.2 示例2&#xff1a; 3.re.findall3.1 示例 4.re.fullmatch4.1 示例1&#xff1a;4.2 示例2: 5.re.split5.1 示例1:5.2 示例2&#xff1a;5.3 示例3&#xff1a; 6.re.sub6.1 示例&#…

vue3+Vite+TS项目,配置ESlint和Prettier

创建vue3项目 实操过的有两种方式 1.vue脚手架2.vite&#xff08;推荐&#xff0c;也是尤大大团队研发&#xff09; 具体怎么新建一个vue3项目就不多讲了&#xff0c;可以按照官方文档来 创建后的文件目录长这样 多提一句&#xff0c;vite也会随着时间不断迭代&#xff0c;后…

【绘图案例-自定义进度条 Objective-C语言】

一、好,我们接着来说这个自定义进度条 1.这个Slider啊,简单的这个value属性,介绍完了,以后,监听也可以监听的到了,接下来,我们来做这个自定义进度条啊, 那么,首先啊,我是这么想的,在这个slider的最小值、和、最大值、我给它改成0、到、1、 因为如果这样的话,到时候…

安装 使用 ida pro linux

安装 ida pro linux 下载地址 下载解压文件&#xff0c;然后linux下直接双击安装 ida7.5demo*******.run这个安装包 然后查找安装目录&#xff0c;一般桌面图标都有对应执行程序的路径 将crack包中的内容覆盖到这个安装目录中 然后双击执行就可以正常运行&#xff0c;new 打…

安装 allure 时踩到的坑:ERROR: JAVA_HOME is set to an invalid directory

报错内容是&#xff1a; 安装 allure 时ERROR: JAVA_HOME is set to an invalid directory: F:\soft\jdk Please set the JAVA_HOME variable in your environment to match the location of your Java installation。 这个问题的原因是java环境的环境变量不能运行 也就是在cm…

大数据导论-大数据分析——沐雨先生

【实验目的】 掌握Pthon/R语言进行大数据分析&#xff0c;包括分类任务和聚类任务。掌握kNN、决策树、SVM分类器、kmeans聚类算法的Python或R语言编程方法。 【实验内容】 使用Python或R语言完成大数据分析任务 1、使用kNN、决策树、SVM模型&#xff0c;对iris数据集进行分类…

5步到位,苹果手机铃声设置原来这么简单!

苹果手机铃声设置是个人化手机体验的重要部分&#xff0c;通过设置喜爱的铃声可以让手机更加个性化&#xff0c;也更容易识别来电。然而&#xff0c;对于一些新手来说&#xff0c;可能不太清楚如何在苹果手机上进行铃声设置&#xff0c;或者可能不知道如何将自己喜欢的音乐或声…

web渗透测试漏洞复现:Springboot Actuator未授权漏洞复现

web渗透测试漏洞复现 1. Springboot Actuator未授权漏洞复现1.1 Springboot Actuator模块简介1.2 Springboot Actuator未授权漏洞复现1.2.1 spingboot Actuator框架的判断1.2.2 spingboot Actuator 1.x版本漏洞1.2.3 spingboot Actuator 2.x版本漏洞1.2.3 Actuator接口访问复现…

基于云计算的前端资源管理系统的设计与实现

hello宝子们...我们是艾斯视觉擅长ui设计和前端开发10年经验&#xff01;希望我的分享能帮助到您&#xff01;如需帮助可以评论关注私信我们一起探讨&#xff01;致敬感谢感恩&#xff01; 随着互联网的快速发展&#xff0c;前端资源管理成为了一个重要的课题。本文旨在设计并实…

【正点原子FreeRTOS学习笔记】————(14)事件标志组

这里写目录标题 一、事件标志组简介&#xff08;了解&#xff09;二、事件标志组相关API函数介绍&#xff08;熟悉&#xff09;三、事件标志组实验&#xff08;掌握&#xff09; 一、事件标志组简介&#xff08;了解&#xff09; 事件标志位&#xff1a;用一个位&#xff0c;来…

旺店通·旗舰奇门和金蝶云星空单据接口对接

旺店通旗舰奇门和金蝶云星空单据接口对接 来源系统:金蝶云星空 金蝶K/3Cloud&#xff08;金蝶云星空&#xff09;是移动互联网时代的新型ERP&#xff0c;是基于WEB2.0与云技术的新时代企业管理服务平台。金蝶K/3Cloud围绕着“生态、人人、体验”&#xff0c;旨在帮助企业打造面…

外包干了15天,技术退步明显。。。。。。

说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入武汉某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试&a…