Java反射之获取构造方法,成员变量,成员方法以及反射的作用

目录

  • 1.什么是反射
  • 2.获取Class对象的三种方式
  • 3.反射获取构造方法
  • 4.反射获取成员变量
  • 5.反射获取成员方法
  • 6.反射的作用

1.什么是反射

在Java中,反射是指程序在运行时动态地获取类的信息、调用方法和访问属性的能力。
通过反射,可以在运行时获取类的构造函数、方法和字段等信息,并且可以在运行时动态地创建对象、调用方法和访问属性,而不需要在编译时知道类的具体信息。
反射提供了一种机制,使得编写通用的、灵活的代码成为可能,但同时也会增加代码的复杂性和性能开销。

反射允许对封装类的字段(成员变量),方法(成员方法)和构造函数(构造方法)的信息进行编程访问。

在这里插入图片描述

2.获取Class对象的三种方式

Class.forName("全类名");

		//全类名:包名+类名Class clazz1 = Class.forName("case11.Student");//最常用

类名.class

		 //一般当作参数进行传递Class clazz2 = Student.class;

对象.getClass();

		Student s = new Student();Class clazz3 = s.getClass();

3.反射获取构造方法

创建一个Student类:定义多种构造方法

public class Student {private String name;private int age;public Student() {}public Student(String name) {this.name = name;}protected Student(int age) {this.age = age;}private Student(String name, int age) {this.name = name;this.age = age;}
}

主函数:演示反射获取构造方法的各种函数

public class Main{public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {//获取class字节码文件对象Class clazz = Class.forName("case11.Student");//获取public构造方法Constructor[] cons = clazz.getConstructors();for (Constructor con : cons) {System.out.println(con);}System.out.println("-------------------------");//获取所有构造方法Constructor[] con1 = clazz.getDeclaredConstructors();for (Constructor constructor : con1) {System.out.println(constructor);}System.out.println("-------------------------");//获取空参构造方法Constructor con2 = clazz.getDeclaredConstructor();System.out.println(con2);System.out.println("-------------------------");//获取带参数的构造方法System.out.println(clazz.getDeclaredConstructor(String.class));System.out.println(clazz.getDeclaredConstructor(int.class));Constructor con3 = clazz.getDeclaredConstructor(String.class, int.class);System.out.println(con3);System.out.println("------------------------");//获取构造方法的权限修饰符int modifiers = con3.getModifiers();System.out.println(modifiers);//获取构造方法的参数Parameter[] parameters = con3.getParameters();for (Parameter parameter : parameters) {System.out.println(parameter);}//暴力反射:临时取消权限的校验con3.setAccessible(true);//创建对象Student student = (Student) con3.newInstance("张三", 123);System.out.println(student);}
}

4.反射获取成员变量

①Class类中用于获取成员变量的方法:
Field[] getFields():返回所有公共成员变量对象的数组
Field[] getDeclaredFields(): 返回所有成员变量对象的数组
Field getField(String name): 返回单个公共成员变量对象
Field getDeclaredField(String name): 返回单个成员变量对象

②Field类中用于创建对象的方法:
void set(Object obj,Object value): 赋值
Object get(Object obj) 获取值。

创建一个Student类:

public class Student {private String name;private int age;public String gender;public Student() {}public Student(String name, int age, String gender) {this.name = name;this.age = age;this.gender = gender;}

主函数:利用反射修改成员变量

public class Main{public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {//获取class字节码文件的对象Class<?> clazz = Class.forName("case12.Student");//获取公共的成员变量Field[] fields = clazz.getFields();for (Field field : fields) {System.out.println(field);//public java.lang.String case12.Student.gender}//获取所有的成员变量Field[] fields1 = clazz.getDeclaredFields();//获取单个的成员变量Field gender = clazz.getField("gender");//获取私有的成员变量Field name = clazz.getDeclaredField("name");//获取权限修饰符int modifiers = name.getModifiers();//获取成员变量名name的值String n = name.getName();//获取成员变量数据类型Class<?> type = name.getType();System.out.println(type);//class java.lang.String//获取成员变量记录的值Student s = new Student("zhangsan", 23, "男");//临时取消访问权限name.setAccessible(true);Object value = name.get(s);System.out.println(value);//zhangsan//修改对象里面记录的值name.set(s, "lisi");System.out.println(s);//Student{name = lisi, age = 23, gender = 男}}
}

5.反射获取成员方法

①class类中用于获取成员方法的方法:
Method[] getMethods(): 返回所有公共成员方法对象的数组,包括继承的
Method[] getDeclaredMethods(): 返回所有成员方法对象的数组,不包括继承的
Method getMethod(String name, Class<?>... parameterTypes): 返回单个公共成员方法对象 Method getDeclaredMethod(String name, Class<?>… parameterTypes): 返回单个成员方法对象

②Method类中用于创建对象的方法:
Object invoke(Object obj, Object… args): 运行方法
参数一:用obj对象调用该方法
参数二:调用方法的传递的参数(如果没有就不写
返回值:方法的返回值(如果没有就不写)

定义一个Student类:

public class Student {private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}/*** 获取** @return name*/public String getName() {return name;}/*** 设置** @param name*/public void setName(String name) {this.name = name;}/*** 获取** @return age*/public int getAge() {return age;}/*** 设置** @param age*/public void setAge(int age) {this.age = age;}public void sleep() {System.out.println("睡觉");}private void eat(String something) throws IOException, NullPointerException, ClassCastException {System.out.println("在吃" + something);}public String toString() {return "Student{name = " + name + ", age = " + age + "}";}
}

主函数:演示反射获取成员方法

public class Main{public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {//获取class字节码文件对象Class<?> clazz = Class.forName("case13.Student");//获取公共的所有的方法对象Method[] methods = clazz.getMethods();for (Method method : methods) {System.out.println(method);//包含了父类中的所有的公共方法}//获取所有的方法但不能获取父类的方法,但可以获取本类中私有方法Method[] methods1 = clazz.getDeclaredMethods();//获取私有的单个方法Method m = clazz.getDeclaredMethod("eat", String.class);//获取方法的修饰符int modifiers = m.getModifiers();//获取方法的名字String name = m.getName();//获取方法的形参Parameter[] parameters = m.getParameters();for (Parameter parameter : parameters) {System.out.println(parameter);//java.lang.String arg0}//获取方法抛出的异常Class[] exceptionTypes = m.getExceptionTypes();for (Class exceptionType : exceptionTypes) {System.out.println(exceptionType);}//运行方法//定义方法的调用者Student s = new Student();//临时取消私有方法的访问权限m.setAccessible(true);m.invoke(s, "汉堡包");//在吃汉堡包}
}

6.反射的作用

①获取一个类里面所有的信息,获取到了之后,再执行其他的业务逻辑
②结合配置文件,动态的创建对象并调用方法

在Java中,反射可以用于获取和操作类的信息,包括类的属性、方法、构造函数等。

  1. 动态获取类的信息:使用反射可以在运行时动态获取类的信息,例如获取类的属性、方法、构造函数等,并可以通过反射来创建类的实例。
  2. 动态创建对象:通过反射可以在运行时动态创建一个类的对象,而无需在编译时提前知道需要创建哪个类的对象。
  3. 调用对象的方法:通过反射可以调用一个类的方法,包括公有方法和私有方法。这使得我们可以在运行时根据需要动态调用不同的方法。
  4. 修改私有属性:通过反射可以修改一个类的私有属性的值,即使这个属性没有提供公开的set方法。
  5. 扩展应用:反射还可以用于实现一些框架和工具,例如注解处理器、对象序列化、单元测试等。
    需要注意的是,反射使用起来较为复杂,在性能上也比直接调用方法要慢。因此,在使用反射时应该谨慎,并在必要的情况下才使用。

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

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

相关文章

1_工程设计模式-简单工厂设计

工程设计模式 一.简单工程设计模式 1.概念 简单工厂模式( Simple Factory Pattern )是指由一个工厂对象决定创建出哪一种产品类的实例。 但它不属于 GOF 23 种设计模式。简单工厂适用于工厂类负责创建的对象较少的场景&#xff0c;且客户端只需要传入工厂类的参数&#xff…

测试组合生成器-allpairspy

1、前言 在我们写功能用例时&#xff0c;常常会遇到多个参数有很多的选项&#xff0c;而如果想把这些参数值都要覆盖执行的话&#xff0c;工作量可想而知。那有没有什么办法既可以减少用例数量&#xff0c;也可以保证用例质量又降低测试时间成本&#xff0c;本篇将介绍一款工具…

两个bash函数创建一个数据库

echo ” $1,$2”> database grep “^$1,” database| sed -e "s/^$1", //" | tail -n 1 echo ” $1,$2”> database echo: echo 是一个常用的命令行工具&#xff0c;用于将文本输出到终端或者重定向到文件中。 $1 和 $2: 这是 shell 脚本中的位置参数。…

65.Slice处理工具【Sort、Contains、Find】

文章目录 一、排序1、sort包介绍2、对自定义结构体集合进行排序3、sort包的相关函数4、sort包已经支持的内部数据类型排序1、IntSlice 类型及[]int 排序2、Float64Slice 类型及[]float64 排序与IntSlice类似3、StringSlice 类型及[]string 排序 5、自定义结构体的简单化排序 二…

蟹目标检测数据集VOC格式400张

蟹&#xff0c;一种独特的海洋生物&#xff0c;以其强壮的身体和独特的生活习性而闻名。 蟹的身体宽厚&#xff0c;有一对锐利的大钳子&#xff0c;这使得它们在寻找食物和保护自己时非常有力。蟹的外观颜色多样&#xff0c;有绿色、蓝色、棕色和红色等&#xff0c;这使得它们在…

【软件测试】黑盒测试

《等价类划分法》 有效等价类无效等价类 &#xff08;输入条件&#xff09;10 < x < 100&#xff08;有效等价类&#xff09;10 < x < 100&#xff08;无效等价类&#xff09;x < 10 和 x >100 《边界值分析法》 基本原则 如果输入条件规定了取值范围&…

SpringIOC之support模块DelegatingMessageSource

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

React Three Fiber动画

使用静态对象和形状构建 3D 场景非常酷,但是当你可以使用动画使场景栩栩如生时,它会更酷。 在 3D 世界中,有一个称为角色装配的过程,它允许你创建称为骨架的特殊对象,其作用类似于骨骼和关节系统。 这些骨架连接到一块 3D 几何体上,例如人、动物或其他任何物体,并允许你…

UFW 要点:常见防火墙规则和命令

前些天发现了一个人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;最重要的屌图甚多&#xff0c;忍不住分享一下给大家。点击跳转到网站。 UFW 要点&#xff1a;常见防火墙规则和命令 介绍 UFW&#xff08;uncomplicated fire wall&#xff09;是一个…

Java学习——设计模式——结构型模式2

文章目录 结构型模式装饰者模式桥接模式外观模式组合模式享元模式 结构型模式 结构型模式主要涉及如何组合各种对象以便获得更好、更灵活的结构。虽然面向对象的继承机制提供了最基本的子类扩展父类的功能&#xff0c;但结构型模式不仅仅简单地使用继承&#xff0c;而更多地通过…

ssm基于BS的项目监管系统+jsp论文

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自古…

NX/UG二次开发—C\C++开发单个DLL支持多版本NX一种方法

1、去除附加包含目录下的NX相关的lib文件&#xff1a; 2、从对应的dll导出ufun函数和NXopen函数&#xff1a; libufun.dll; libufun_cam.dll; libufun_cae.dll; libufun_die.dll; libufun_vdac.dll; libufun_weld.dll; libugopenint.dll; libugopenint_cae.dll; libugopenint_…

Apache HTTPD 换行解析漏洞(CVE-2017-15715)详解

Apache HTTPD 换行解析漏洞&#xff08;CVE-2017-15715&#xff09; 1.cd到CVE-2017-15715 cd vulhub/httpd/CVE-2017-15715 2.运行docker-compose build docker-compose build 3.运行docker-compose up -d 4.查看docker-compose ps 5.访问 出现这个表示安装成功 6.漏洞复现…

C练习——鸡兔同笼

题目&#xff1a; 有若干只鸡和兔子在同一个笼子里&#xff0c;从上面数&#xff0c;有98个头&#xff1b;从下面数&#xff0c;有386只脚。问笼中各有几只鸡和兔&#xff1f; 解析&#xff1a; 数学上列二元一次方程组求解&#xff0c;所以采用穷举法&#xff0c;但可以缩小…

[SpringBoot]接口的多实现:选择性注入SpringBoot接口的实现类

最近在项目中遇到两种情况&#xff0c;准备写个博客记录一下。 情况说明&#xff1a;Service层一个接口是否可以存在多个具体实现&#xff0c;此时应该如何调用Service&#xff08;的具体实现&#xff09;&#xff1f; 其实之前的项目中也遇到过这种情况&#xff0c;只不过我采…

rax3000m 刷机 uboot + immortalwrt

0. 环境 - win10 ubuntu22 - rax3000m 生产日期20231027 一台&#xff08;nand版本的&#xff09; 1. 上电&#xff0c;登录web 电脑连接路由器LAN1 http://192.168.10.1/ 账号&#xff1a;user 密码&#xff1a;KK6kYC!3 上网设置&#xff1a;自动获取IP 2. 开启 ssh 2…

有趣的前端知识(一)

推荐阅读 智能化校园&#xff1a;深入探讨云端管理系统设计与实现&#xff08;一&#xff09; 智能化校园&#xff1a;深入探讨云端管理系统设计与实现&#xff08;二&#xff09; 文章目录 推荐阅读HTML简介基础声明HTML标签标题段落注释水平线文本格式化标签超链接图像<i…

Vue2 - 数据响应式原理

目录 1&#xff0c;总览2&#xff0c;Observer3&#xff0c;Dep4&#xff0c;Watcher5&#xff0c;Schedule 1&#xff0c;总览 vue2官网参考 简单介绍下上图流程&#xff1a;以 Data 为中心来说&#xff0c; Vue 会将传递给 Vue 实例的 data 选项&#xff08;普通 js 对象&a…

吴飞教授 人工智能 模型与算法 启发式搜索课件发散分析

一、文章介绍 本文是针对吴飞教授在MOOC课程 &#xff1a;《人工智能&#xff1a;模型与算法》 2.1节 启发式搜索的课前发散 在课程2.1节 启发式搜索章节中&#xff0c;吴飞教授以如何计算城市地图两点之间最短路径为例&#xff0c;重点讲授了贪婪最佳优先搜索和A*搜索算法&a…

Cadence Editor 关于画PCB相关内容

目录 一 新建PCB文件 二 指定封装库 三 导入网表 四 放置器件 五 绘制板框 六 精准定位 七 原理图与PCB的交互 八 飞线设置 九 层管理 布局布线阶段需要显示的层 十 器件位置相关 1 器件选取的基准点 2 旋转 3 对齐 4 把器件移动到底层或顶层 5 锁定与解锁 6…