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

java求职学习day17

反射机制

1 基本概念

(1)通常情况下编写代码都是固定的,无论运行多少次执行的结果也是固定的,在某些特殊场合中编写代码时不确定要创建什么类型的对象,也不确定要调用什么样的方法,这些都希望通过运行时传递的参数来决定,该机制叫做动态编程技术,也就是反射机制。
(2)通俗来说,反射机制就是用于动态创建对象并且动态调用方法的机制。目前主流的框架底层都是采用反射机制实现的。
如:
Person p = new Person(); - 表示声明Person类型的引用指向Person类型的对象
p.show(); - 表示调用Person类中的成员方法show
分析:

1.1问题1:那什么叫动态啊?什么叫反射?

意思就是说我在编写代码时,不确定创建什么样的对象以及调用什么样的方法的。在什么时候确定,直到运行阶段,我们才会确定创建什么样的对象以及调用什么样的方法。也就是说它是在运行阶段,根据我们运行阶段传递的这个参数来决定的。所以我们把这种机制啊,也叫做动态编程技术。
所以总结下来一句话,什么叫反射?反射机制就是我们可以在运行阶段来决定创建什么样的对象以及调用什么样的方法的这种机制,我们就叫反射机制。

2 Class

那么刚刚呢,我们提到了反射机制啊,就是一种动态编程的机制。对不对?好了,那我们要想实现动态编程,那就得编写通用的代码,而要想实现通用的代码,我们就得需要借助一个类叫Class类。

注意哦,

这个类的类名非常特别,因为我们以前定义类的关键字呢,也叫class。只不过呢这个Class的首字母是大写。

那这个类的话呢?我们说它的类名啊,竟然起的如此的独特,那说明这个类跟我们以前所学的那些类,应该都是怎么办?与众不同的对吧?

2.1 基本概念

(1)java.lang.Class类的实例可以用于描述Java应用程序中的类和接口,也就是一种数据类型。
分析:
问题2:Class类和我们之前类的自己写的类和java官方写的类的一个区别?

以前我们学的那些JAVA官方的类也好,包括我们自己写的类也好,我们说。这些类的实例本质上是不是就是在堆区中的一块内存区域而已?对吗?哎,仅仅是在啊堆区中的一块内存区域而已。

但是呢,这个Class这个类比较独特,独特的地方就在于它的对象不再单纯,是指内存空间堆区中的一块内存区了,而它有一个特殊的含义,就是这个类的对象不再是以前我们讲的那些类的对象了,而是代表一种数据类型。

更严格的说法是这个类的对象实际上就是加载到内存中的一个运行时类。注意哦哎,以前的对象就是对象,但是这个类比较特殊,这个类的对象代表的是一个类,那说明类是不是也是一种比较特殊的对象。是不是有点颠覆以前的面向对象的概念。

所以总结下来Class这个类跟以前我们讲的类不一样的地方在于这个类的对象,它不再是堆区中的一块儿内存空间了,而是代表的是加载到方法区时的正在运行的这个类

(2)该类没有公共构造方法,该类的实例由Java虚拟机和类加载器自动构造完成,本质上就是加载到内 存中的运行时类。
那么我们说既然这个类的实例是不需要我们自己创建的,它都会自动创建。那我们是不是要想调用我们的方法,我们得要想办法获取这些对象。那怎么获取呢?获取class对象的方式,这罗列了很多

2.2 获取Class对象的方式

(1)使用数据类型.class的方式可以获取对应类型的Class对象(掌握)。
分析:
问题3:一个数据类型应该有几个class对象?
一个。因为我已经说的很明白了嘛,是把这个类型类信息 运行时 类信息加载到内存时的一个代表嘛。那你想想只要是同一种类型对吧,加载到内存中,实际上是不是都是一个运行时类?那一个运行时类,那是不是对应的就应该是一个Class对象,虽然获取的方式很多,但实际上是不是都是一个Class对象?
下面这张图片是对代码运行结果的一个总结
 

(2)使用引用/对象.getClass()的方式可以获取对应类型的Class对象。
分析:
下面这张图有一个温馨提示:记得复习一下Object类,因为我们的getClass()方法是在Object类中有提到过

(3)使用包装类.TYPE的方式可以获取对应基本数据类型的Class对象。

包装类里面实际上都给大家写了一个叫type的常量,我们说它的作用就是获取class对象的,但是呢,当时呢,只是提了一下,实际上就是为这儿做一个铺垫。

(4)使用Class.forName()的方式来获取参数指定类型的Class对象(掌握)。
注意复习一下包装类

(5)使用类加载器ClassLoader的方式获取指定类型的Class对象。
 

来自java.lang-->然后找Class类--->cclass类里面是不是得要获取这个class这个类加载器的这么一个方法呀,找一下叫做什么来着?叫做getClassLoader---->

那返回的是不是一个class loader类型的?而class loader这个类里面的话,那如何?再去获取它的一个什么来着呢?那就是再加载一个类呢?这儿是不是有一个叫load class,然后参数的话呢?是不是给一个叫name?然后是不是就会返回一个class对象。

2.3 常用的方法(掌握)

给大家介绍完获取Class对象的方式之后,那实际上我们现在用这五种方式中的任意一种。是不是都可以得到Class类的一个对象,对吧?或者说一个Class类的引用,那有了这个引用之后,我们能做什么事儿呢?可以调用这个类中的方法。

意思就是说当前这个class对象如果表示的是person类。那我调new Instance(),是不是就会创建person类的对象。也就是说,你代表什么类?我就创建什么类型的对象呗。那这一点实际上是不是正好就验证我们前面所讲的动态编程,就是在编译阶段我也不知道创建什么样的对象,而到了运行阶段,我是不是才确定创建什么样的对象?那这个时候我们实际上是不是就可以用new instance

但是这种方式有它的优势啊,什么优势呢?动态的创建对象。啥意思啊?就是在编译阶段,我可以不确定我创建什么样的对象,是不是到运行阶段我再确定。

为什么说这种方式比较low啊,因为你想想这还得让用户自己出,用户哪懂代码啊,对不对?或者说我们后续的话呢,从键盘输入是不是这也不太好控制啊?你说那怎么办?以后开发中怎么做的?以后开发中我们采用的策略是?这样一个策略叫做读取配置文件。

3 Constructor

3.1 基本概念

java.lang.reflect.Constructor 类主要用于描述获取到的构造方法信息

3.2 Class类的常用方法

3.3 Constructor类的常用方法

4 Field

4.1 基本概念

java.lang.reflect.Field 类主要用于描述获取到的单个成员变量信息。

4.2 Class类的常用方法

4.3 Field类的常用方法

5 Method

5.1 基本概念

java.lang.reflect.Method 类主要用于描述获取到的单个成员方法信息。

5.2 Class类的常用方法

5.3 Method类的常用方法

6 获取其它结构信息


http://www.kler.cn/a/520768.html

相关文章:

  • 公式与函数的应用
  • 深入探索 Vue 3 Markdown 编辑器:高级功能与实现
  • cloc下载和使用
  • 蓝桥杯例题三
  • 高级java每日一道面试题-2025年01月23日-数据库篇-主键与索引有什么区别 ?
  • Flink把kafa数据写入Doris的N种方法及对比。
  • 1.26学习
  • 2025年01月26日Github流行趋势
  • Python3 【正则表达式】:经典示例参考手册
  • 寒假1.25
  • 第04章 15 vtkObjectBase和vtkObject的基本特性及它们在VTK类体系中基础性作用
  • 动手学图神经网络(4):利用图神经网络进行图分类
  • 云岚到家项目100问 v1.0
  • 二叉树高频题目——下——不含树型dp
  • 基于单片机的智能小区门禁系统设计(论文+源码)
  • 【填充——双指针,DP】
  • 【算法】剪枝与优化
  • java复习总结
  • 有赞任务js脚本
  • C#的反射使用示例
  • c++小知识点
  • 从规则到神经网络:机器翻译技术的演进与未来展望
  • Golang 执行流程分析
  • 「 机器人 」扑翼飞行器的偏航力矩控制:分周期参数调节机制
  • 【SpringMVC】——Json数据交互处理
  • Leetcode::3432. 统计元素和差值为偶数的分区方案