反射的基本知识(详解)

一:反射的引出

1:问题

比如我们给出一个student类 其方法show(),我们将其写入配置文件中;现在我们来一个新的需求说是要改变重写一个show()方法 show()2,那么如何在不修改源码的情况下进行修改,这时我们通过反射就可以完成

2:过程

student类:

public class Student {public void show(){System.out.println("is show()");}
}

配置文件以txt文件为例子(pro.txt):

className = cn.fanshe.Student
methodName = show

测试类:

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Properties;/** 我们利用反射和配置文件,可以使:应用程序更新时,对源码无需进行任何修改* 我们只需要将新类发送给客户端,并修改配置文件即可*/
public class Demo {public static void main(String[] args) throws Exception {//通过反射获取Class对象Class stuClass = Class.forName(getValue("className"));//"cn.fanshe.Student"//2获取show()方法Method m = stuClass.getMethod(getValue("methodName"));//show//3.调用show()方法m.invoke(stuClass.newInstance());//stuClass.newInstance() 获取当前类的对象    //以前:对象.方法();现在:方法名.(对象)}//此方法接收一个key,在配置文件中获取相应的valuepublic static String getValue(String key) throws IOException{Properties pro = new Properties();//获取配置文件的对象FileReader in = new FileReader("pro.txt");//获取输入流pro.load(in);//将流加载到配置文件对象中in.close();return pro.getProperty(key);//返回根据key获取的value值}
}

控制台输出:
is show()

需求:
当我们升级这个系统时,不要Student类,而需要新写一个Student2的类时,这时只需要更改pro.txt的文件内容就可以了。代码就一点不用改动
要替换的student2类:

public class Student2 {public void show2(){System.out.println("is show2()");}
}

配置文件更改为:

className = cn.fanshe.Student2
methodName = show2

控制台输出:
is show2();

3:总结

可以看到我们只是改了配置文件,而并没有去改变源码

二:反射是什么

JAVA反射机制是在运行状态中
对于任意一个类,都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意一个方法和属性;
这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制

三:反射的功能

  • 在运行时判断任意一个对象所属的类
  • 在运行时构造任意一个类的对象
  • 在运行时判断任意一个类所具有的成员变量和方法
  • 在运行时调用任意一个对象的方法
    (要想解剖一个类,必须先要获取到该类的字节码文件(.class)对象(class)。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.)
    在这里插入图片描述

五:关于class对象和class类

1:class对象

Class对象的由来是将class文件读入内存,并为之创建一个Class对象
在这里插入图片描述

2:class类

  • 代表一个类,是Java反射机制的起源和入口
  • 用于获取与类相关的各种信息, 提供了获取类信息的相关方法
  • Class类继承自Object类
  • Class类是所有类的共同的图纸
  • 每个类有自己的对象,同时每个类也看做是一个对象,有共同的图纸Class,存放类的结构信息,能够通过相应方法取出相应 的信息:类的名字、属性、方法、构造方法、父类和接口。
  • Class 类的实例表示正在运行的 Java 应用程序中的类和接口。也就是jvm中有N多的实例每个类都有该Class对象。(包括基本数据类型)
  • Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的defineClass 方法自动构造的。也就是这不需要我们自己去处理创建,JVM已经帮我们创建好了。没有公共的构造方法,方法共有64个太多了。

3:获取class对象方法

通过Class.forName(“全类名”) (最常用的方法)

try {Class<?> perClazz = Class.forName("reflect_fanshe.Person");System.out.println(perClazz);} catch (ClassNotFoundException e) {e.printStackTrace();}

4:根据反射入口对象(class)获取类的各种信息

(1):perClazz.getMethods() 获取此类的所有public方法(父类的,实现接口的,自己的)

Class<?> perClazz = null;try {perClazz = Class.forName("reflect_fanshe.Person");} catch (ClassNotFoundException e) {e.printStackTrace();}Method[] methods = perClazz.getMethods();//遍历所有方法for (Method method : methods) {System.out.println(method);}}

(2):获取当前类(只有本类的)的所有方法和属性,包括私有的

在这里插入图片描述

(3):可以获取当前类的对象,并通过对象调用类的方法

在这里插入图片描述

(4):通过反射获取对象的实例,并操作对象

class.newInstance() ,并强转类型,然后就可以操作对象了,主要是调用方法。
在这里插入图片描述

六:反射的使用场景

  • java编码时知道类和对象的具体信息,此时直接对类和对象进行操作即可,无需反射
  • 如果编码时不知道类或者对象的具体信息,此时应该使用反射来实现
  • 比如类的名称放在XML文件中,属性和属性值放在XML文件中,需要在运行时读取XML文件,动态获取类的信息在编译时根本无法知道该对象或类可能属于哪些类,程序只依靠运行时信息来发现该对象和类的真实信息

参考自

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

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

相关文章

.NET 5.0 RC1 发布,离正式版发布仅剩两个版本,与 netty 相比更具竞争力

原文&#xff1a;http://dwz.win/Qf8作者&#xff1a;Richard翻译&#xff1a;精致码农-王亮说明&#xff1a;1. 本译文并不是完全逐句翻译的&#xff0c;存在部分语句我实在不知道如何翻译或组织就根据个人理解用自己的话表述了。2. 本文有不少超链接&#xff0c;由于微信公众…

一个例子带你搞懂python作用域中的global、nonlocal和local

在编程中&#xff0c;只要接触过函数的&#xff0c;我相信都理解什么是全局变量和局部变量&#xff0c;概念比较简单&#xff0c;这里就不做解释了。在python中&#xff0c;用global语句就能将变量定义为全局变量&#xff0c;但是最近又发现有个nonlocal&#xff0c;一时搞不太…

初识ABP vNext(10):ABP设置管理

点击上方蓝字"小黑在哪里"关注我吧定义设置使用设置前言上一篇介绍了ABP模块化开发的基本步骤&#xff0c;完成了一个简单的文件上传功能。通常的模块都有一些自己的配置信息&#xff0c;比如上篇讲到的FileOptions类&#xff0c;其中配置了文件的上传目录&#xff0…

类加载机制(整个过程详解)

一:背景 类加载机制是在我们的真个java的运行阶段中的其中一个阶段。 二:什么是快乐星球(类加载机制) 我们编写的 Java 文件都是以.java 为后缀的文件&#xff0c;编译器会将我们编写的.java 的文件编译成.class 文件&#xff0c;简单来说类加载机制就是jvm从文件系统将一系…

每天一小时python官方文档学习(一)————python的简单介绍

我们都知道&#xff0c;python的官方文档写得十分详尽&#xff0c;也是每一个学习python的人都绕不开的。 所以从今天开始&#xff0c;我每天都会用一小时学习python的官方文档&#xff0c;按照文档目录的顺序&#xff0c;摘录一些有用的语句&#xff0c;写下一些个人心得放在博…

leetcode860. 柠檬水找零

一:论语 这里的小不忍指的是一方面我们受到挫折而控制不住自己而大发脾气&#xff0c;还有一方面指的是我们的过于优柔寡断&#xff0c;对于自己或者他人的过失&#xff0c;不忍心加以责罚。 二:题目 三:上码 class Solution { public:bool lemonadeChange(vector<int&g…

跟我一起学.NetCore之Asp.NetCore启动流程浅析

前言一个Asp.NetCore项目&#xff0c;知道大概的启动流程是有必要的&#xff0c;比如后续遇见配置信息覆盖等相关问题时也大概知道是什么原因&#xff0c;了解原因之后&#xff0c;再去搜索引擎找答案&#xff0c;否则目标不明确&#xff0c;茫茫人海怎么会一下找到自己想要的&…

每天一小时python官方文档学习(二)————流程控制工具

4. 其他流程控制工具 4.1. if 语句 大多数人都很熟悉的if语句&#xff1a; if condition1:pass elif condition2:pass else condition3:pass注意python中没有switch或case语句&#xff0c;所以一个 if ... elif ... elif ... 序列可以看作是其他语言中的 switch 或 case 语句…

leetcode406. 根据身高重建队列

一&#xff1a;你不一定逆风翻盘&#xff0c;但请一定向阳而生 二&#xff1a;题目 三&#xff1a;上码 class Solution { public:/**解析题意:这个给出的people的数组中,我们需要根据其元素people[i] [hi,ki];然后根据其ki来表示大于hi身高的人的个数&#xff0c;来进行排序…

.NET Core 下使用 RabbitMQ

介绍RabbitMQ是一个开源的,基于AMQP(Advanced Message Queuing Protocol)协议的完整,可复用的企业级消息队列(Message Queue 一种应用程序与应用程序之间的一种通信方法)系统,RabbitMQ可以实现点对点,发布订阅等消息处理模式官网&#xff1a;https://www.rabbitmq.com/dotnet.h…

每天一小时python官方文档学习(三)————函数

上一天看到第四章的一半&#xff0c;介绍了一些常用的流程控制工具&#xff0c;也就是常用语句&#xff0c;主要是if、for、range()、break、continue、else和pass。今天把第四章剩下的看完&#xff0c;讲的是如何在python中定义和使用函数。函数其实就是一种对代码的封装&…

leetcode452. 用最少数量的箭引爆气球

一:论语 少些自我感动&#xff0c;多谢反思&#xff0c;时刻警惕自己是否在假装很努力&#xff0c;自己懂不懂 自己会不会 自己想要什么 只有自己 最清楚 二&#xff1a;题目 三:上码 class Solution { public:/**思路:1.这道题类似无重叠空间,我们先按每个气球的右边界升序…

ASP.NET Core 3.x启动时运行异步任务(一)

这是一个大的题目&#xff0c;需要用几篇文章来说清楚。这是第一篇。一、前言在我们的项目中&#xff0c;有时候我们需要在应用程序启动前执行一些一次性的逻辑。比方说&#xff1a;验证配置的正确性、填充缓存、或者运行数据库清理/迁移等。如何合理、有效、优雅地完成这个任务…

每天一小时python官方文档学习(四)————数据结构之列表

终于进入到第五章数据结构部分了&#xff0c;python中常用的容器有列表、元组、集合和字典&#xff0c;今天主要了解的是最为常用的列表。 5. 数据结构 5.1. 列表的更多特性 对于列表的操作有很多&#xff0c;具体操作看官方文档就行&#xff0c;但是我们对列表有什么操作&a…

leetcode435. 无重叠区间

一&#xff1a;论语 道不同 不相为谋 我们没有理由拿着自己的评判标准 去看待别人所经历的事情&#xff0c;重来就没有真正的感同身受&#xff0c;我们能做的就是尊重他人的看法 &#xff0c;保留自己的态度。 二&#xff1a;题目 三:上码 class Solution { public:/**思路:…

Swagger扩展为你添油加气

关注架构师高级俱乐部开启架构之路不定期福利发放哦~Leon读完需要4分钟速读仅需 2 分钟介绍一款Swagger扩展日常接口开发中都需要用到Swagger来生成接口文档并用 Swagger 自带支持的模拟请求进行测试&#xff0c;但是需要支持认证或者上传文件等操作需要自行去按接口进行开发才…

leetcode763. 划分字母区间

一&#xff1a;论语 保留自己的态度&#xff0c;尊重别人的看法&#xff0c;不强迫别人按照自己的意愿做事。 二:题目 三:上码 class Solution { public:vector<int> partitionLabels(string s) {/**思路:1.在这里我们选取的数据结构是map容器,我们只要下记录每个字母…

每天一小时python官方文档学习(五)————数据结构之元组、集合与字典

昨天介绍完了最常用的列表&#xff0c;之后就是次常用的元组、集合与字典了。 5.3. 元组和序列 元组和之前讲过的列表有很多共同特性&#xff0c;例如索引和切片操作。实际上&#xff0c;他们是 序列 数据类型&#xff08;list, tuple, range&#xff09;中的两种。 一个元组…

跟我一起学.NetCore之依赖注入

前言现阶段而言&#xff0c;依赖注入相关组件如果不会用一两个&#xff0c;感觉在Code的世界里肯定是落伍了&#xff0c;最起码得有工厂模式的思想&#xff0c;知道这样做的好处&#xff1b;提及到依赖注入&#xff0c;通常会关联出两个概念&#xff1a;Ioc(控制反转)和DI(依赖…

每天一小时python官方文档学习(六)————循环和条件控制的进阶用法

学习完数据结构之后&#xff0c;我们就能够对之前在第二天中讲过的流程控制工具&#xff0c;添加更多的用法了&#xff0c;这里主要介绍的是for循环语句和if与while条件判断语句。 5.6. 循环的技巧 我们学过的遍历序列for i in range() 、for i in list() 和 for i in tuple(…