java --- 反射

目录

一、什么是反射?

 二、获取 Class对象 的三种方式

三、反射获取构造方法(Constructor)

四、反射获取成员变量(Field)

五、反射获取成员方法(Method)


一、什么是反射?

  • 反射允许对成员变量,成员方法和构造方法的信息进行编程访问。
  • 反射就是把java类中的各种成分映射成一个个的Java对象

  • 例如:一个类有:成员变量、方法、构造方法等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。

提问:为什么不能用IO流从上往下一行一行的进行读取呢?

  • 但是当我们读取到构造方法和普通成员方法时,无法区分。
  • 成员变量和局部变量也很难区分。

因此我们使用 反射 获取成员变量就可以得到成员所有信息

 二、获取 Class对象 的三种方式

使用反射的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)

  1.  Class.forName ( " 全类名 " ) ;             最为常用
  2. 类名 . class       一般更多的是当做参数进行传递
  3. 对象 . getClass ( ) ;  当已经有类对象是才能使用

//第一种方式Class cl1 = Class.forName("反射.Student");System.out.println(cl1);//第二种方式Class cl2 = Student.class;System.out.println(cl2);System.out.println(cl1 == cl2);//第三种方法Student s = new Student();Class cl3 = s.getClass();System.out.println(cl3);System.out.println(cl1 == cl3);

三、反射获取构造方法(Constructor)

Class类中获取构造方法的方法:

Constructor <?> [ ] getConstructors()返回所有公共构造方法对象的数组
Constructor <?> [ ] getDeclaredConstructors()返回所有构造方法对象的数组
Constructor <T> getConstructor ( Class <> .. parameterTypes )返回单个公共构造方法对象
Constructor <T> getDeclaredConstructor(Class <>.. parameterTypes)返回单个构造方法对象
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {Class cl1 = Class.forName("反射.Student");//利用反射获取构造方法Constructor[] con1 = cl1.getDeclaredConstructors();for (Constructor c : con1) {System.out.println(c);}Constructor con2 = cl1.getDeclaredConstructor(int.class);System.out.println(con2);//获取权限修饰符int modifiers = con2.getModifiers();//private :2 ,public:1 ,protected :4System.out.println(modifiers);//创建对象con2.setAccessible(true);//为了调用非public的方法,需要这样con2.newInstance(18);}

四、反射获取成员变量(Field)

Class类中获取成员变量的方法:

Field [ ]  getFields()返回所有公共成员变量对象的数组
Field [ ]  getDeclaredFields ( )返回所有成员变量对象的数组
Field getField ( String name )返回单个公共成员变量对象
Field getDeclaredField ( String name )返回单个成员变量对象

Field类中用于创建对象的方法:

void set ( Object obj , Object value )赋值
Object get ( Object obj )获取值
// 1.获取Class字节码文件的对象Class clazz = Class.forName("ReFlect.Student");// 获取成员变量//获取所有的成员变量Field[] fields = clazz.getDeclaredFields();for (Field field : fields) {System.out.println(field);//private java.lang.String ReFlect.Student.name//private int ReFlect.Student.age//public java.lang.String ReFlect.Student.gender}//获取单个成员变量Field gender = clazz.getField("gender");System.out.println(gender);//public java.lang.String ReFlect.Student.gender//Field name = clazz.getField("name");  //无法获取 name是private私有的Field name = clazz.getDeclaredField("name"); System.out.println(name);//private java.lang.String ReFlect.Student.name//获取到成员变量后我们可以继续://1.获取权限修饰符int modifier = name.getModifiers();System.out.println(modifier);  //2//2.获取成员变量名String n = name.getName();System.out.println(n); //name//3.获取数据类型Class<?> type = name.getType();System.out.println(type); //class java.lang.String//4.获取成员变量记录的值Student s = new Student("张三",23,"男");name.setAccessible(true);Object value = (String)name.get(s);  //张三System.out.println(value);//5.修改成员变量记录的值name.set(s, "李四");System.out.println(s);  //Student [name=李四, age=23, gender=男]	}

五、反射获取成员方法(Method)

Class类中获取成员方法的方法:

Method [ ]  getMethods ( )返回所有公共成员方法对象的数组,包括继承的
Method [ ]  getDeclaredMethods ( )返回所有成员方法对象的数组,不包括继承的
Method getMethod ( String name ,  Cass <?> .. parameterTypes )返回单个公共成员方法对象
Method getDeclaredMethod ( String name ,  Class<?>... parameterTypes )返回单个成员方法对象

Method类中用于创建对象的方法:

Object invoke ( Object obj ,  Object... args )运行方法

参数一:用obj对象调用该方法

参数二:调用方法的传递的参数(如果没有就不写)
返回值:方法的返回值(如果没有就不写)

public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {// 1.获取Class字节码文件的对象Class clazz = Class.forName("ReFlect.Student");// 2.获取里面所有的方法对象//(包含所有父类中的所有的公共方法)Method[] methods1 = clazz.getMethods();for(Method method : methods1) {System.out.println(method);}//获取里面所有的方法对象(只能获取本类中私有方法)Method[] methods2 = clazz.getDeclaredMethods();for(Method method : methods2) {System.out.println(method);}//3.获取指定单一方法对象Method m = clazz.getDeclaredMethod("eat", String.class);System.out.println(m); //private void ReFlect.Student.eat(java.lang.String)//1.获取权限修饰符int modifers = m.getModifiers();System.out.println(modifers); //2//2.获取方法名String name = m.getName();System.out.println(name);  //eat//3.获取方法形参Parameter[] parameters = m.getParameters();for (Parameter parameter : parameters) {System.out.println(parameter);	 //java.lang.String arg0}//4.获取方法返回值//5.获取方法抛出异常Class<?>[] exceptionTypes = m.getExceptionTypes();for(Class exceptiontype : exceptionTypes) {System.out.println(exceptiontype);//class Java.io.TOException//class java. lang. NullPointerException//class java. lang.ClassCastException}//方法运行Student s = new Student();m.setAccessible(true);m.invoke(s, "汉堡包");}

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

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

相关文章

app上架-您的应用在运行时,未同步告知权限申请的使用目的,向用户索取(相机)等权限,不符合华为应用市场审核标准。

上架提示 您的应用在运行时&#xff0c;未同步告知权限申请的使用目的&#xff0c;向用户索取&#xff08;相机&#xff09;等权限&#xff0c;不符合华为应用市场审核标准。 测试步骤&#xff1a;管理-添加-点击二维码&#xff0c;申请相机权限 修改建议&#xff1a;APP在调…

智能优化算法应用:基于非洲秃鹫算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于非洲秃鹫算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于非洲秃鹫算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.非洲秃鹫算法4.实验参数设定5.算法结果6.…

UE4 UE5 一直面向屏幕

一直面相屏幕&#xff0c;方法很简单 新建一个蓝图&#xff0c;如下添加组件&#xff1a; 蓝图如下&#xff1a; Rotation Actor &#xff1a;需要跟随镜头旋转的物体 Update&#xff1a;一个timeline&#xff08;替代event tick 只是为了循环&#xff09; Timeline&#xff…

百年东芝“瞄准”汽车「芯」机遇

在汽车“新四化”大变革的驱动下&#xff0c;汽车半导体市场进入需求暴涨的新周期。 “智能电动汽车所需要的半导体种类和数量正在急剧增加。” 东芝电子分立器件应用技术部经理成栋表示&#xff0c;东芝电子正在加大汽车半导体市场的布局&#xff0c;从而满足汽车电动化、智能…

深入了解Java中的锁机制

目录 1. synchronized关键字 1.1 基本概念 1.2 内置锁 1.3 限制 2. ReentrantLock 2.1 概述 2.2 公平性与非公平性 2.3 条件变量 3. 读写锁&#xff08;ReadWriteLock&#xff09; 3.1 概念 3.2 适用场景 4. StampedLock 4.1 概述 4.2 乐观读与悲观读 4.3 适用场…

WT588F34B-16S语音芯片:四通道16K采样率混音播放的应用优势

随着科技的不断进步&#xff0c;语音芯片在电子产品中的应用越来越广泛。其中&#xff0c;WT588F34B-16S语音芯片凭借其卓越的性能和创新的功能&#xff0c;引起了市场的广泛关注。特别是其支持四通道16K采样率混音播放的功能&#xff0c;为实际应用带来了显著的优势。本文将深…

w13渗透测试实战之https账号密码捕抓

此次实验需要配合arp欺骗,不知道arp欺骗的&#xff0c;可以查看这篇w13渗透测试实战之ARP欺骗攻击&#xff08;ARP断网攻击&#xff09; 一、实验环境 攻击机&#xff1a;linux Kali 靶机&#xff1a;window 7 网络环境&#xff1a;虚拟机NAT 网关&#xff1a;192.168.89.2实…

浅谈能耗系统在马来西亚连锁餐饮业的应用

1.背景信息 Background 针对连锁餐饮业能耗高且能源管理不合理的问题&#xff0c;利用计算机网络技术、通讯技术、计量控制技术等信息化技术&#xff0c;实现能源资源分类分项计量和能源资源运行监管功能&#xff0c;清晰描述各分店总的用能现状&#xff1b;实时监测各供电回路…

Hal深入实战/perfetto-systrace实战/SurfaceFlinger合集-安卓framework开发实战开发

背景 hi&#xff0c;粉丝朋友们&#xff1a; 大家好&#xff01; 下面来介绍一下新的framework专题halperfettosurafceflinger&#xff0c;这个专题主要就是分为3大块&#xff0c;但是彼此直接又是相互关联的。 比如surfaceflingre模块深入分析需要用到hal相关的模块&#xff…

IDEA创建springboot工程

选择spring boot的版本和依赖 finish创建完成 删除无用的文件

【make/Makefile】Linux下进度条的设计与实现

一、简单介绍make/Makefile Makefile 和 makefile 不区分大小写&#xff0c;但是一定只能是 “makefile” &#xff01;&#xff01;&#xff01; make 是一个指令&#xff0c;makefile 是一个文件。 Makefile 格式形式&#xff1a; 使用 make 生成目标文件时&#xff0c;默认…

论文解读:On the Integration of Self-Attention and Convolution

自注意力机制与卷积结合&#xff1a;On the Integration of Self-Attention and Convolution(CVPR2022) 引言 1&#xff1a;卷积可以接受比较大的图片的&#xff0c;但自注意力机制如果图片特别大的话&#xff0c;运算规模会特别大&#xff0c;即上图中右边(卷积)会算得比较快…

Python开发GUI常用库PyQt6和PySide6介绍之二:设计师(Designer)注意事项

Python开发GUI常用库PyQt6和PySide6介绍之二&#xff1a;设计师&#xff08;Designer&#xff09;注意事项 PySide6和PyQt6都有自己的设计师&#xff08;Designer&#xff09;&#xff0c;用于可视化地设计和布局GUI应用程序的界面。这些设计师提供了丰富的工具和功能&#xf…

快速入门 — — 在Moonbeam上开发

访问熟悉的以太坊工具是一回事&#xff0c;获得顶级支持、拥有构建突破性跨链应用程序的资源是另一回事。 Moonbeam汇集了通过集成互操作性解决方案访问任何链的能力、具有完全以太坊兼容性的理想开发环境&#xff0c;以及使用Substrate在波卡上安全扩展的能力。 开始在Moonb…

MT6785|MTK6785安卓核心板功能规格介绍_Helio G95核心板

MT6785安卓核心板是一款功能强大的工业级4G智能模块&#xff0c;它采用了Android 9.0操作系统。该核心板内置了蓝牙、FM、WLAN和GPS模块&#xff0c;具有高度集成的基带平台&#xff0c;结合了调制解调器和应用处理子系统&#xff0c;以支持LTE/LTE-A和C2K智能终端应用。 MTK67…

2023年12月GESP Python三、四级编程题真题解析

三、2023年12月GESP Python三级编程题 【三级编程题1】 【试题名称】&#xff1a;小猫分鱼 【问题描述】 海滩上有一堆鱼&#xff0c;N只小猫来分。第一只小猫把这堆鱼平均分为N份&#xff0c;多了i<N条鱼&#xff0c;这只小猫把多的i条鱼扔入海中&#xff0c;拿走了一份…

【小沐学Unity3d】3ds Max 减面工具:Simplyon(Unity3d,Python)

文章目录 1、简介2、下载安装2.1 安装Simlygon插件2.2 安装USD插件 3、使用测试4、Python测试结语 1、简介 Simplygon 带有一个 Unity 插件&#xff0c;它公开了优化功能&#xff0c;例如缩减、聚合、重新划分网格、冒名顶替者&#xff08;SingleView、BillboardCloud / Veget…

Module build failed: TypeError: this.getOptions is not a function

在使用webpack打包出现以上错误时&#xff0c;可能是你安装的css-loader和style-loader的版本过高。 我用的webpack版本是3.6.0 因此需要降低一下版本 在你编辑器终端输入以下命令&#xff1a; npm install css-loader3.6.0 npm install --save-dev style-loader1.00 然后接下…

hyper-v ubuntu2204指定静态ip地址

虚拟机静态IP设置 虚拟机每次重新启动&#xff0c;都会动态分配IP&#xff0c;这导致我们无法使用一个固定的ip连接到虚拟机内部。解决该问题的最直接有效的办法就是给虚拟机绑定2张网卡&#xff0c;一张用于连接外网、一张用于连接内网。 init 0 关机&#xff0c;也可以从管…

如何用 CleanMyMac 来保护 Mac 隐私

大家早上好&#xff0c;中午好&#xff0c;下午好&#xff0c;晚上好。 在我们使用MacBook上的自带浏览器-Safari&#xff08;或者一些其他浏览器&#xff09;进行网页浏览的时候&#xff0c;往往会留下一些痕迹。如果这些痕迹涉及一些敏感数据信息的话&#xff0c;那么我们肯…