Java反射学习笔记

Java中的反射学习笔记 Java反射机制是指在运行时动态地获取一个类的信息并能够操作该类的属性和方法的能力。Java反射机制使得程序能够在运行时借助Class类的API来操作自身的属性和方法,从而大大增强了Java的灵活性和可扩展性。 阅读详情

前言:

先说说反射的作用。我们都知道处于安全、维护方便等因素的考虑,java中定义了4中访问权限,分别是:private(仅限本类)、默认无关键字(本包内所有类,包含本包内的子类)、protected(本包、其他包的子类)、public(所有类)。然后因为某些特殊的需要,需要访问某些原本不可见的方法(或者字段),比如访问某个Person类内部的某个private方法,则一般的方法是不行的,这个时候反射的作用就体现出来了。

正题:

在Java中的各种操作,无非就是对类、字段、方法这三类操作,因为在反射中,也定义了三个类Class、Field、Method来分别对这三个进行处理(从英文的字面也可以看出来)。

如果我们要获得某个类的字段(或方法),则步骤一般如下:

1、获取该类的“一个Class实例”,比如

Class<Person> mPersonClass=Person.class;

当然,通过Person的实例来获取也可以的,比如有一个mPerson的实例,则这样也可以

Class<Person> mPersonClass=mPerson.getClass();

2、用class实例来获取字段(或方法),比如

Method method=mPersonClass.getDeclaredMethod("setAge",int.class);
这个方法如果成功的话,会得到一个Method实例,如果不成功,则会报错,常见的报错有NoSuchMethodException。

注意:一般对于Method而言,常用的获取方式有getMethod()和getDeclaredMethod()两种,但是更建议用后者,因为前者只当需要反射的方法是public时才有效,如果对于private方法也使用getMethod(),则会报NoSuchMethodException错误!!!getDeclaredMethod()对于private也一样使用。类似的的,对于Field有getField()和getDeclaredField()两种,推荐使用后者,原因是一样的。

getDeclaredMethod()这个方法中有2部分参数,第一部分是方法名,第2部分是声明参数类型,比如在Person类中有private boolean setInfo(String name,int age)方法,则按如下形式,返回值类型不需要加入第2部分的参数中

Method method=mPerson.getDeclaredMethod("setInfo",String.class,int.class)

3、设置可访问,这一点对于private的字段或方法尤其重要,不然一样会报错

method.setAccessible(true);

4、进行方法或字段的操作,对于方法调用,使用method.invoke();需要传入2部分参数:1、调用的对象,2、参数列表(如果方法不需要参数,则不需要;如果需要,则按顺序对应写入,这个和getDeclaredMethod()声明的应该对应)

boolean result=method.invoke(Person.class.newInstance(),20);
//这里讲年龄设置为20,第一部分的参数也可以用你自己获取到的对象

对于field,则有get()和set()方法,原理类似,需传入:对象+参数列表

11/10注:第一个参数是调用对象,如果是反射的是静态方法,则可传入null或者是对象

例子:

现在我有个Person类,通过反射调用其中的方法:

Person.java

package edu.hust.cs;

public class Person {

	/**年龄*/
	private int age=0;
	
	/**姓名*/
	private String name=null;
	
	/**下面的语句块,在创建对象时会调用。
	 * 顺序为:成员变量>下面的语句块>构造器
	 * */
	{
		System.out.println("初始化时,Name:"+name+",Age:"+age);
	}
	
	private boolean setPersonInfo(String _name)
	{
		name=_name;
		System.out.println("只设置姓名时,Name:"+name+",Age:"+age);
		return true;
	}
	
	private boolean setPersonInfo(String _name,int _age)
	{
		name=_name;
		age=_age;
		System.out.println("设置姓名和年龄时,Name:"+name+",Age:"+age);
		return false;
	}
}

测试类Test.java

package edu.hust.cs;

import java.lang.reflect.Method;

public class Test {

	public static void main(String[] args) 
	{
		try{
			//获取一个实例
			//当然也可以直接new Person();
			Person person=Person.class.newInstance();
			//反射"setPersonInfo(String _name)"方法
			Method method=person.getClass().
					getDeclaredMethod("setPersonInfo",String.class);
			//因为原方法为private,所以设置可访问,这一条语句是必须的!
			method.setAccessible(true);
			//调用该方法,并获取返回结果
			boolean result=(boolean) method.invoke(person,"张三");
			System.out.println(result);
			
			//反射"setPersonInfo(String _name,int _age)"方法
			Method method2=person.getClass().
					getDeclaredMethod("setPersonInfo",String.class,int.class);
			method2.setAccessible(true);
			boolean result2=(boolean) method2.invoke(person,"张三",23);
			System.out.println(result2);
			
		}catch(Exception e){
			e.printStackTrace();
		}
		System.exit(0);
	}
}

输出结果如下:

初始化时,Name:null,Age:0
只设置姓名时,Name:张三,Age:0
true
设置姓名和年龄时,Name:张三,Age:23
false


STM32F103C8T6蓝莓派用HAL库GPIO模拟SPI驱动MAX31865读取PT100温度(附完整代码) 本文详细介绍了如何在STM32F103C8T6蓝莓派开发板上使用HAL库通过GPIO模拟SPI驱动MAX31865读取PT100温度传感器的完整方案。内容包括硬件连接、CubeMX配置、GPIO模拟SPI实现、温度计算算法及常见问题排查,并附有完整代码示例,帮助开发者快速实现高精度温度测量。 阅读详情

相关推荐

AS7341光谱传感器实战:I2C驱动、Arduino与Python代码及校准指南

光谱传感器通过多通道滤光片与光电二极管阵列,将光信号转换为数字量,实现波长级测量。其技术价值在于以低成本替代传统光谱仪,完成颜色识别、光源分析等任务。在植物补光、水质检测等场景中,多通道光谱数据能精准区分红光与深红光比例。AS7341作为9通道(8可见光+1近红外)I2C传感器,支持Arduino、ESP32和树莓派,结合增益与积分时间调节,可适应强弱光环境。本文从芯片原理出发,详解寄存器配置、双平台代码实现、暗电流与白板校准方法,并给出常见问题排查指南,帮助创客快速构建光谱应用。

weixin_42519733的博客 252

java学习笔记15——反射机制

2、声明榨汁机(Juicer),包含运行方法:public void run(Fruit f),方法体中,调用f的榨汁方法squeeze()4.(了解)反射的应用4:通过反射获取注解的信息(见com.atguigu04.other.annotation包的测试)> 因为反射体现了动态性(可以在运行时动态的获取对象所属的类,动态的调用相关的方法),所以我们在设计框架的时候,> 从我们作为程序员开发者的角度来讲,我们开发中主要是完成业务代码,对于相关的对象、方法的调用都是确定的。

qq_58956810的博客 754

基于carsim与Simulink联合仿真的车辆换道轨迹规划与轨迹跟踪模型

PID_反步控制_滑膜控制三种四旋翼无人机轨迹跟踪控制算法仿真 附带对应的说明文档,提供建模过程与仿真结果文献(英文)➕PPT 描述:采用的同一种参考轨迹,都是三维仿真 三种控制方法: [1]PID控制、[2]反步控制、[3]滑膜控制(三个仿真模型) 每个仿真均应用了同一种轨迹路径,直接运行即可出三维图,可以实现四旋翼无人机轨迹的跟踪

2501_90804007的博客 1083

JAVA基础学习笔记-day17-反射

Reflection(反射)是被视为动态语言的关键,反射机制允许程序在运行期间借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构,所以,我们形象的称之为:反射。

天才在左,疯子在右,而我只想做个不折不扣的乐天派 1170

Blender.粒子效果

Blender.粒子效果 ✦ shift+A新建一个棱角球,细分(之后要分解成许多小颗粒) ✦ 给球添加粒子系统,这时播放粒子会向下掉,力场权重☛重力☛0后,粒子会在球体周围运动 ✦ shift+A添加一个力场,调整力场强度 ✦如果粒子运动太快,我们可以在输出属性中调整时间重映射的原始值 ✦想让粒子在球周围运动而不是发散出去,在物理属性找到力场设置,调整流的大小 ✦S键将球形缩小到看不见 ✦给粒子变添加立方体的形状,在粒子属性里找到渲染选项,将“光晕”改为“物体”,在实例物体中选择新建的立方

weixin_46385629的博客 6668

深入解析STM32定时器中央对齐模式3的双中断机制

本文深入解析了STM32定时器中央对齐模式3的双中断机制。该模式在一个PWM周期内,会在计数器到达ARR(上溢)和0(下溢)时各触发一次更新中断,实现更精细的实时控制。文章详细阐述了其工作原理、配置方法,并指导如何在中断服务函数中通过DIR位区分中断来源,同时探讨了其在电机控制、数字电源等场景下的应用优势与CPU负载挑战。

weixin_29164185的博客 492

java反射批量处理字段值_Java反射篇学习笔记

今天重新学习了java中的反射,写一篇学习笔记总结一下。代码基本都是照着两篇博客敲的:其中,第一篇比较详细点。作为初学者,我觉得不能根据晦涩的概念强行去理解一个知识点,而应该结合具体的应用实例。先初步理解一下反射的作用:(1)反编译,将 .class文件转化为 .java文件(2)通过class对象来访问其对应类的对象的属性、方法、构造方法。1、Class类先来理解一下Class这个特殊的的类,在...

weixin_36199116的博客 284

Windows Server安装Intel I219-V网卡驱动完整教程

在Windows Server系统上安装Intel I219-V网卡驱动的方法。

小白成长历程 5172

JAVA学习笔记-反射(黑马程序员)

反射允许对封装类的字段、方法和构造函数的信息进行编程访问。

qq_45773654的博客 219

ROS2 - 乐动激光雷达 LD06

STL-06P 主要由激光测距核心,无线传电单元,无线通讯单元,角度测量单元、电机驱动单元和机械外壳组成。STL-06P 测距核心采用 DTOF 技术,可进行每秒 5000 次的测距。每次测距时,雷达发射出红外激光,激光遇到目标物体后被反射到单光子接收单元。

机器人控制与仿真应用 3483

SAP BW/4HANA 项目字段级数据血缘分析的方法与工具

利用SAP自带工具可以在一定程度上查看数据流和字段使用情况,但往往需要人工逐步深挖。适用于简单场景或验证单个字段的映射。借助SAP数据治理解决方案(如 Information Steward、Data Intelligence 等)能够自动整合元数据,提供图形化、跨系统的血缘分析,适合对数据 lineage 有严格要求的企业级项目。第三方工具则提供了灵活强大的功能,如自动文档、生成功能丰富的报告,对于复杂环境下的血缘分析和影响分析非常有帮助。自行开发SQL/CDS脚本。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 470

java反射(个人学习笔记)

对反射的使用与理解

penglaifei的博客 687

Android性能分析——GPU资源耗尽分析(二十六)

本文分析了Android车机系统中GPU资源耗尽导致应用闪退的案例。通过日志定位到EGL_BAD_ALLOC错误,表明系统无法分配足够图形资源创建EGL上下文。问题主要发生在渲染线程初始化EGL环境时,根源在于车机系统对GPU资源的严格限制(如EGLContext数量、GPU内存等)。文中详细解读了SkiaOpenGLPipeline和EglManager的源码调用链路,指出createContext()函数中的致命断言是崩溃的直接原因,并提出了移除断言、增加重试机制、优雅降级等改进方案。该案例揭示了资源受

小旭的专栏 675

Java学习笔记之反射

反射简单来说就是根据配置文件生成相应的对象实例,在不修改源码的情况下,仅通过更改配置文件生成不同的对象。在反射中方法也视为对象。假设有如下的配置文件:通过properties读取的配置文件,得到的返回类型是字符串,这里假设用变量A来接收字符串。此时A就是“com.Cat”这个字符串。但我们无法用new A();的方式创建cat对象,因为new后面需要跟类名而A只是一个保存了字符串的变量。所以通过properties读取配置文件我们只能隐性的得到类名对应的字符串,而无法明确类名是什么,也就无法创建对象。

hssh_的博客 824

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java反射的学习笔记

Java反射的学习笔记 作者:Mats 笔记日期:2020-07-25 1. 反射的概念 ​ 注解在官方的回答中是这样说的:将类的各个组成部分封装为其他对象,这就是反射的机制。或许在看到这句话的时候很懵比,但是在此之前我们需要先来了解一下一份简单的Helloworld.java代码在计算机的三个阶段。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kjJHopC2-1595664282177)(C:\Users\Administrator\AppData\Roaming

Mats的博客 229

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

java反射学习笔记

java反射机制提供了什么功能? 在运行时能够判断任意一个对象所属的类 在运行时构造任意一个类的对象 在运行时判断任意一个类所具有的成员变量和方法 在运行时调用任一对象的方法 在运行时创建新类对象 new和反射创建有什么区别 new: 静态编译,在编译期就将模块编译进来,执行该字节码文件,所有的模块都被加载; 反射:动态编译,编译期没有加载,等到模块被调用时才加载; 注:spring的ioc就...

weixin_42269834的博客 183

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【Java学习笔记】反射(reflection)

反射机制,Class类,类加载基本说明,通过反射访问成员、属性........

2401_88623584的博客 1271

Java反射 学习笔记

反射: 框架设计的灵魂 框架:半成品软件。可以在框架的基础上进行软件的开发,简化编码 反射:将类的各个组成部分封装为其他对象,这就是反射机制。 将类的成员变量封装为Field对象,构造函数封装为Constructor对象,将成员方法封装为Method对象 反射的好处: 在程序的运行过程中,操作这些对象。 eg: 在程序中输入这样一行代码:String str="abc"; str.输入str.时会提示你一大堆的方法,这些方法从哪来的,这里就运用了反射机制,你在此处定义了一个字符串,会把字符串的字节码文件加

Roxannekkk的博客 278

【Java学习笔记】70 - 反射

1. Class也是类,因此也继承Object类[类图]2. Class类对象不是new出来的,而是系统创建的3.对于某个类的Class类对象,在内存中只有一份,因为类只加载一次[演示]4.每个Class类的实例都会记得自己是由哪个Class实例所生成5.通过Class类对象可以完整地得到一个类的完整结构,通过一系列API6. Class对象是存放在堆的7. 类的字节码二进制数据,是放在方法区的,有的地方称为类的元数据(包括方法代码,变量名,方法名,访问权限等等)

qq_41891655的博客 519

学习笔记03 java反射的应用

Set HashSet 所有的元素是唯一的 a=“a” b="a" "a"数组的大小是固定,数组的类型是固定的。5.继承,当一个类继承BaseServlet之后,BaseServlet中的共有方法就直接可以被子类调用。3.不在设置单独请求映射,在请求中添加方法参数,根据方法参数,找到对应的函数处理请求。4.反射,通过函数的名称和函数的参数类型找到方法,并且invoke该方法。声明一个Thread类的子类,子类中重写Thread类的run方法。ip 主机。

m0_72604562的博客 68

【Java学习笔记】基础加强之反射

本文是在学习了刘意老师的Java基础视频之后,写出的学习笔记。 1.类的加载 当程序要使用某个类时,如果该类还没有被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化。 2.类加载器 负责将.class文件加载到内存中,并为之生成对应的Class对象。 3.反射 通过class文件对象,使用该文件中的成员变量、构造方法、成员方法。 4.反射的原理 首先需要把j...

我们仨 209

【java】 反射 学习笔记

java中万事万物皆对象,类也是对象,它是Class类的对象,这个对象叫做该类的类类型。 创建该类的类类型的三种方式: //Foo的实例对象 Foo f1 = new Foo(); //法一,任何类都有一个隐含的静态成员变量class Class c1 = Foo.class; //法二 Class c2 = f1.getClass(); //法三 Class c3 = null; ...

要继续努力的孤独的博客 216

java反射实现接口_Java反射学习笔记

非原创:以下内容都是学习Java反射时从网上摘录的信息汇总Java反射机制可以让我们在编译期(Compile Time)之外的运行期(Runtime)检查类,接口,变量以及方法的信息。反射还可以让我们在运行期实例化对象,调用方法,通过调用get/set方法获取变量的值。下面是一个Java反射的简单例子:Method[] methods = MyObject.class.getMethods();f...

weixin_36354965的博客 2077

java202303java学习笔记第四十天反射获取构造方法1

java

qq_41632427的博客 61
上一篇: Android对于不同分辨率的支持
下一篇: Android从SD卡加载大量图片
冒泡彩虹
博客等级 码龄14年 17粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值