首页 > 编程语言 >java反射

java反射

时间:2023-02-14 11:58:26浏览次数:44  
标签:反射 java 构造方法 对象 获取 Class

一、反射的概述


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

通过反射机制,可以在不了解类的结构的情况下,调用对象的方法,并进行对象的属性访问,这加强了程序的灵活性,使得java语言可以在多态的环境中发挥更大的作用。反射机制也使得java语言可以在运行时期动态的加载类,从而实现动态加载。

简述:

- 在 java 程序运行中 , 对于任意一个类, 都能够通过反射知道这个类的所有属性和方法
- 对于这任意的一个类的对象 , 能够访问任意属性和方法
- 这种动态获取信息以及动态调用对象成员的功能我们称为 Java 语言的反射机制 。
( 运行起来后的xx.class字节码文件 , JVM 会对应的生成一个 java.lang.Class 类的对象 , 该对象是获取成员的关键)

反射机制所需的类主要有java.lang包中的Class类和java.lang.reflect包中的Constructor类(构造方法)、Field类(属性)、Method类(普通方法)和Parameter类(参数)。

二、反射机制原理示意图


image-20230214105924189

二、反射能做什么


# 在运行时判断任意一个对象所属的类
# 在运行时构造任意一个类的对象
# 在运行时得到任意一个类所具有的成员变量和方法
# 在运行时调用任意一个对象的成员变量和方法
# 生成动态代理

三、学习反射学的是什么?


反射是通过 class 字节码文件生成 Class 的对象然后获取里面的内容

- 如何从 class 字节码文件中获取对象 (Class 对象 )
- 如何获取构造方法 ( 创建对象 )
- 如何获取属性 ( 赋值取值 )
- 如何获取其他方法 ( 调用 )

1.获取字节码对象

1-1.Class类中的静态方法
Class.forName("com.Student");
1-2.通过类的clazz属性
Student.class;
1-3.通过对象来获得字节码文件对象
Student student = new Student();
Class<? extends Student> aClass = student.getClass();
1-4.理解

java 文件 : 就是我们建立书写的 java 代码文件
字节码文件 : 通过 java 文件翻译之后 class 文件 ( 存在硬盘 , 真实可见 )
字节码文件对象 :当class文件加载内存之后,虚拟机自动创建出来的对象这个对象会包含构造器、属性、如何获取其他方法

我们反射获得的就是字节码对象 , 在内存中和硬盘中都是唯一的

2.获取构造方法

方法类似但是方法中使用不同的规则来获取不同的构造方法 :

get(获取)constructor(构造方法)DecIared(表示私有)最后的s表示复数(所有)

前置操作(获取字节码文件对象):

Class<?> aClass = Class.forName("com.Student");
2-1.获取构造方法(公共、所有)的对象
aClass.getConstructors();
2-2.获取构造方法(公共、私有、所有)的对象
aClass.getDeclaredConstructors();
2-3.获取无参或带参(参数需要类的字节码文件)构造方法
aClass.getConstructor();
aClass.getConstructor(String.class, Integer.class);
//下面的可以获取指定的构造方法,但是与上面不同的是还可以获取私有构造方法
aClass.getDeclaredConstructor(String.class);

四、反射优点和缺点

  • 优点 :可以动态的创建和使用对象( 也是框架底层核心 ),使用灵活,没有反射机制, 框架技术就失去底层支撑 。

  • 缺点 :使用反射基本是解释执行,对执行速度有影响。

未完待续。。。

部分笔记来源于:韩顺平 (bilibili.com)

标签:反射,java,构造方法,对象,获取,Class
From: https://www.cnblogs.com/ynxiyan/p/17119092.html

相关文章