第9章-第2节-Java中的反射机制

1、概念:

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

他的工作原理是这样的:当一个字节码文件加载到内存的时候, jvm会对该字节码进行解剖,然后创建一个对象的Class对象,jvm把字节码文件的信息全部都存储到该Class对象中,我们只要获取到Class对象,我们就可以使用该对象设置对象的属性或者调用对象的方法等操作。

2、获取Class类对象的三种方式

* 类名.class属性
* 对象名.getClass()方法
* Class.forName(全类名)方法 

3、原理图:

4、案例:获得Class类

class ReflectDemo {public static void main(String[] args) throws ClassNotFoundException {// 1.Class类中的静态方法forName("全类名")//全类名:包名 - 类名Class clazz1 = Class.forName("com.bean.Student");System.out.println(clazz1);// 2.通过class属性来获取Class clazz2 = Student.class;System.out.println(clazz2);// 3.利用对象的getClass方法来获取class对象// getClass方法是定义在Object类中.Student s = new Student();Class clazz3 = s.getClass();System.out.println(clazz3);System.out.println(clazz1 == clazz2);System.out.println(clazz2 == clazz3);}
}

 5、获得构造方法,还可以获得成员属性Field、成员方法Method等这些,获得私有的时用带上Declared的方法,例如:getDeclaredConstructor

public class Student {private String name;private int age;// 私有的有参构造方法private Student(String name) {System.out.println("name的值为:" + name);System.out.println("private...Student的有参构造方法");}// 公共的无参构造方法public Student() {System.out.println("public...Student的无参构造方法");}// 公共的有参构造方法public Student(String name, int age) {System.out.println("name的值为:" + name + "age的值为:" + age);System.out.println("public...Student的有参构造方法");}
}class ReflectDemo {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {System.out.println("获取所有公共构造方法对象的数组===========");method1();System.out.println("获取单个构造方法对象===========");method2();System.out.println("获取所有构造方法对象的数组===========");method3();System.out.println("获取单个构造方法对象===========");method4();}private static void method4() throws ClassNotFoundException, NoSuchMethodException {// Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)://返回单个构造方法对象//1.获取Class对象Class clazz = Class.forName("com.bean.Student");System.out.println("String+int的构造");Constructor constructor = clazz.getDeclaredConstructor(String.class,int.class);System.out.println(constructor);System.out.println("String的构造");constructor=clazz.getDeclaredConstructor(String.class);System.out.println(constructor);}private static void method3() throws ClassNotFoundException, NoSuchMethodException {//Constructor<T> getConstructor(Class<?>... parameterTypes):// 返回单个公共构造方法对象//1.获取Class对象Class clazz = Class.forName("com.bean.Student");//小括号中,一定要跟构造方法的形参保持一致.Constructor constructor1 = clazz.getConstructor();System.out.println(constructor1);Constructor constructor2 = clazz.getConstructor(String.class, int.class);System.out.println(constructor2);//因为Student类中,没有只有一个int的构造,所以这里会报错.
//        Constructor constructor3 = clazz.getConstructor(int.class);
//        System.out.println(constructor3);}private static void method2() throws ClassNotFoundException {//返回所有构造方法对象的数组//1.获取Class对象Class clazz = Class.forName("com.bean.Student");Constructor[] constructors = clazz.getDeclaredConstructors();for (Constructor constructor : constructors) {System.out.println(constructor);}}private static void method1() throws ClassNotFoundException {//返回所有公共构造方法对象的数组//1.获取Class对象Class clazz = Class.forName("com.bean.Student");Constructor[] constructors = clazz.getConstructors();for (Constructor constructor : constructors) {System.out.println(constructor);}}
}

 6、通过构造方法创建对象

方法名说明
T newInstance(Object…initargs)根据指定的构造方法创建对象
setAccessible(boolean flag)设置为true,表示取消访问检查
// T newInstance(Object... initargs):根据指定的构造方法创建对象
class ReflectDemo2 {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {method1();method2();method3();method4();}private static void method4() throws ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {//获取一个私有的构造方法并创建对象//1.获取class对象Class clazz = Class.forName("com.fanshe.Student");//2.获取一个私有化的构造方法.Constructor constructor = clazz.getDeclaredConstructor(String.class);//被private修饰的成员,不能直接使用的//如果用反射强行获取并使用,需要临时取消访问检查constructor.setAccessible(true);//3.直接创建对象Student student = (Student) constructor.newInstance("zhangsan");System.out.println(student);}private static void method3() throws ClassNotFoundException, InstantiationException, IllegalAccessException {//简写格式//1.获取class对象Class clazz = Class.forName("com.bean.Student");//2.在Class类中,有一个newInstance方法,可以利用空参直接创建一个对象Student student = (Student) clazz.newInstance();//这个方法现在已经过时了,了解一下System.out.println(student);}private static void method2() throws ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {//1.获取class对象Class clazz = Class.forName("com.fanshe.Student");//2.获取构造方法对象Constructor constructor = clazz.getConstructor();//3.利用空参来创建Student的对象Student student = (Student) constructor.newInstance();System.out.println(student);}private static void method1() throws ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException, InvocationTargetException {//1.获取class对象Class clazz = Class.forName("com.bean.Student");//2.获取构造方法对象Constructor constructor = clazz.getConstructor(String.class, int.class);//3.利用newInstance创建Student的对象Student student = (Student) constructor.newInstance("杨天真", 22);System.out.println(student);}
}

 7、反射和new 的区别

1)、new的对象无法访问其中的私有属性,反射出来的可以通过设置setAccessible()方法来省略访问权限符;

2)、new必须要知道类名,而反射创建对象不需要知道类型也可以创建;

本电子书目录:《Java基础的重点知识点全集》

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

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

相关文章

Python:pickle 模块详解

pickle 模块是 Python 中用于序列化和反序列化对象的标准模块。它可以将对象转换为字节流&#xff0c;以便将其保存到文件或通过网络传输&#xff0c;然后再将字节流还原为原始对象。以下是 pickle 模块的常用函数、示例以及一些注意事项&#xff1a; pickle.dump() 函数&…

ModuleNotFoundError: No module named ‘wtforms.ext‘

flask运行报错&#xff1a; ModuleNotFoundError: No module named wtforms.ext 解决办法&#xff1a; python -m pip install WTForms2.3.3参考&#xff1a; superset 安装及连接clickhouse可视化_superset clickhouse-CSDN博客

Python每日一练-DAY03

Question 3 题目 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13…求出这个数列的前20项之和 解题思路一 题目分析: 这道题目要求我们计算一个分数序列的前20项之和。 这个分数序列中,每一项的分子是前两项的分子之和,分母是前两项的分母之和。 例如,第三项的分子为2+3=5…

e2studio开发三轴加速度计LIS2DW12(4)----测量倾斜度

e2studio开发三轴加速度计LIS2DW12.4--测量倾斜度 概述视频教学样品申请源码下载计算倾斜角度工作原理单轴倾斜检测双轴倾斜检测三轴倾斜检测通信模式管脚定义IIC通信模式速率新建工程工程模板保存工程路径芯片配置工程模板选择时钟设置UART配置UART属性配置设置e2studio堆栈e…

分析美方推动零信任战略的网络安全创新规律(下)

分析美方推动零信任战略的网络安全创新规律(下) 文章目录 分析美方推动零信任战略的网络安全创新规律(下)前言一、零信任理念产生的成因和创新价值(一)零信任是在传统IT边界消亡时对安全边界的重塑(二)零信任是对原有安全能力体系的重新整合(三)零信任创新的价值在于…

Ubuntu共享文件到win

Ubuntu共享文件到win 1、安装samba sudo apt-get install samba samba-common2、创建一个共享文件夹&#xff0c;并设置777权限 mkdir /home/qyh/share sudo chmod 777 /home/qyh/share我的用户名&#xff1a;qyh。 3、添加用户及密码 sudo smbpasswd -a qyh4、修改配置文…

阿里云大数据ACA及ACP复习题(121~140)

121.数据清洗(Data Cleaning)是用于检测和纠正&#xff08;或删除&#xff09;记录集&#xff0c;表或数据库中的不准确或损坏的记录。下列选项中&#xff0c;对数据清洗描述正确的是(ABC) A:数据清洗可以检测表中的不准确或损坏的记录 B:数据清洗可以识别不正确&#xff0c;不…

多进程实现案例

多进程 多进程&#xff08;简单程序&#xff09; from multiprocessing import Process, Queueclass MyProcess(Process):def __init__(self, q, i):super().__init__()self.q qself.i idef run(self):print(子进程%s 开始put数据 % self.i)self.q.put(我是%s 通过Queue通信…

ssh远程访问及控制

目录 一、ssh协议简介 1、实现远程访问的协议和程序 2、ssh协议的概念及功能 3、ssh协议的工作原理 3.1 对称加密与非对称加密 3.1.1 对称加密&#xff08;Symmetric Encryption&#xff09; 3.1.2 非对称加密&#xff08;Asymmetric Encryption&#xff09; 3.2 公钥传…

C //练习 5-3 用指针方式实现第2章中的函数strcat。函数strcat(s, t)将t指向的字符串复制到s指向的字符串的尾部。

C程序设计语言 &#xff08;第二版&#xff09; 练习 5-3 练习 5-3 用指针方式实现第2章中的函数strcat。函数strcat(s, t)将t指向的字符串复制到s指向的字符串的尾部。 注意&#xff1a;代码在win32控制台运行&#xff0c;在不同的IDE环境下&#xff0c;有部分可能需要变更。…

表对象的标识

表对象标识 kingbase中表作为数据库对象具有一个系统内部的唯一标识符&#xff0c;这个标识符被称为oid&#xff08;对象标识符&#xff09;&#xff0c;它是kingbase用来在整个数据集群中唯一地标识每个数据库对象的一个字段。对于表来说&#xff0c;其OID可以在系统目录表sy…

Pandoc:markdown转word

简介&#xff1a;Pandoc是由John MacFarlane开发的标记语言转换工具&#xff0c;可实现不同标记语言间的格式转换&#xff0c;堪称该领域中的“瑞士军刀”。Pandoc使用Haskell语言编写&#xff0c;以命令行形式实现与用户的交互&#xff0c;可支持多种操作系统&#xff1b;Pand…

JavaScript-jQuery1-笔记

每个页面中一定要先引入jQuery文件 使用this 在jQuery中在一定要使用$(this) 代表当前对象 1.jQuery获取元素对象 $(选择器) 选择器可以是&#xff1a;标签选择器、类选择器、ID选择器、后代选择器、子元素选择器、全局选择器 $(button) 2.绑定事件 $(选择器).事件类型( 事件…

斯坦福CS231n学习笔记:DL与CV教程 (1) | 引言与知识基础

前言 &#x1f4da; 笔记专栏&#xff1a;斯坦福CS231N&#xff1a;面向视觉识别的卷积神经网络&#xff08;23&#xff09;&#x1f517; 课程链接&#xff1a;https://www.bilibili.com/video/BV1xV411R7i5&#x1f4bb; CS231n: 深度学习计算机视觉&#xff08;2017&#xf…

Uibot (RPA设计软件)网页表单填写————课前材料四

微信群发助手机器人的小项目友友们可以参考小北的课前材料二博客~ (本博客中会有部分课程ppt截屏,如有侵权请及请及时与小北我取得联系~&#xff09; 紧接着小北的前两篇博客&#xff0c;友友们我们即将开展新课的学习~RPA 培训前期准备指南——安装Uibot(RPA设计软件&#x…

USB micro输入口中三个问题详解——差分信号、自恢复保险丝SMD1210P050TF、电容滤波

前言&#xff1a;本文对USB micro输入口中遇见的三个问题进行详解&#xff1a;差分信号、自恢复保险丝SMD1210P050TF、电容滤波 目录&#xff1a; 差分信号 自恢复保险丝SMD1210P050TF 电容滤波 如下图&#xff0c;USB为U-F-M5DD-Y-1型号&#xff08;9个引脚&#xff0c;除…

【软件工具】之 Sublime Text

目录 一、Sublime Text 简介二、Sublime 软件配置三、常用快捷操作四、常用插件 一、Sublime Text 简介 SublimeText 是一款非常好用的文本和代码编辑软件&#xff0c;该软件属于轻量级的&#xff0c;启动快、内存占用小、打开大体积文件非常快速。同时该软件有强大的全目录文…

【AIGC-文本/图片生成视频系列-9】MagicVideo-V2: 多阶段高美感视频生成

最近得益于扩散模型的快速发展&#xff0c;文本到视频&#xff08;T2V&#xff09;模型的激增。 今天要介绍的是字节的MagicVideo-V2&#xff0c;一个新颖的多阶段 T2V 框架&#xff0c;它集成了文本到图像 (T2I)、图像到视频 (I2V)、视频到视频 (V2V) 和视频帧插值 (VFI) 模块…

学习笔记-mysql-各种函数的基本使用

1. 聚合函数 count , sum , min , max ,avg , group_concat() -- 将所有员工的名字合并成一行 select group_concat(emp_name) from emp; -- 指定分隔符合并 select department,group_concat(emp_name separator ; ) from emp group by department; -- 指定排序方式和分隔…

LeetCode讲解篇之78. 子集

文章目录 题目描述题解思路题解代码 题目描述 题解思路 初始化一个start变量记录当前从哪里开始遍历搜索nums 搜索过程的数字组合加入结果集 然后从start下标开始遍历nums&#xff0c;更新start&#xff0c;递归搜索 直到搜索完毕&#xff0c;返回结果集 题解代码 class …