Java反射(黑马)

article/2025/6/21 16:57:57

 Java反射(Reflection)是Java语言的一个强大特性,它允许程序在运行时动态地检查和操作类、接口、字段和方法。通过反射,程序可以获取类的信息、创建对象、调用方法、访问字段等,而无需在编译时知道这些类的具体实现。这为Java编程带来了极大的灵活性和动态性。

1. Java反射的基本概念

反射的核心是java.lang.Class类和java.lang.reflect包中的类(如FieldMethodConstructor等)。以下是反射的主要功能:

1.1 获取类的信息

通过反射,可以获取类的名称、父类、接口、字段、方法等信息。

1.2 创建对象

可以动态地创建类的实例,而无需通过new关键字。

1.3 调用方法

可以动态地调用类的方法,包括私有方法。

1.4 访问字段

可以动态地访问类的字段,包括私有字段。

1.5 修改访问权限

可以修改字段和方法的访问权限,例如将私有字段或方法变为可访问。

获取class对象的三种方法

1.Class.forName("全类名")

2.类名.class

3.对象.getClass()

package reflect;public class demo {public static void main(String[] args) throws ClassNotFoundException {/*获取class对象的三种方法1.Class.forName("全类名")2.类名.class3.对象.getClass()*///1.第一种Class cls = Class.forName("reflect.Student");//2.第二种Class cls2 = Student.class;//3.第三种Student st = new Student();Class cls3 = st.getClass();}
}

获取构造函数:
package reflect;import java.lang.reflect.Constructor;public class demo {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {/*获取class对象的三种方法1.Class.forName("全类名")2.类名.class3.对象.getClass()*///1.第一种Class cls = Class.forName("reflect.Student");//2.获取构造方法
//        Constructor[] cons = cls.getConstructors();
//            for (Constructor con : cons) {
//                System.out.println(con);
//
//        }//获取全部
//        Constructor[] cons = cls.getDeclaredConstructors();
//        for (Constructor con : cons) {
//            System.out.println(con);
//        }//获取单个Constructor con1 = cls.getDeclaredConstructor();System.out.println(con1);Constructor con2 = cls.getDeclaredConstructor(String.class,int.class);System.out.println(con2);//获取参数Constructor con4 = cls.getDeclaredConstructor(String.class,int.class);Parameter[] parameters = con4.getParameters();for(Parameter parameter : parameters){System.out.println(parameter);}
}
获取成员变量:

重写tostring().

@Overridepublic String toString() {return "Student{name='" + name + "', age=" + age + ", gender='" + gender + "'}";}

实现:

package reflect;import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Parameter;public class demo {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, NoSuchFieldException, IllegalAccessException {/*获取class成员变量的三种方法1.Field[] getFields() 返回所有公共成员变量对象数组2.Field[] getDeclaredFields()返回所有成员变量对象数组3.Field getField(String name)返回单个公共成员变量对象4.Field getDeclaredField(String name)返回单个成员变量对象Field类创建对象方法void set(Object obj,Object value)赋值Object get(Object obj)获取值*///1.获取字节码文件对象Class cls = Class.forName("reflect.Student");//2.获取成员变量//Field[] fields = cls.getFields();返回公有成员变量Field[] fields = cls.getDeclaredFields();//返回所有成员变量for(Field field : fields){System.out.println(field);}//获取名字Field name = cls.getDeclaredField("name");System.out.println(name);//权限修饰符int modifiers = name.getModifiers();System.out.println(modifiers);//获取名字String n = name.getName();System.out.println(n);//数据类型Class<?> type = name.getType();System.out.println(type);//变量记录的值Student s = new Student("张三", 18, "男");name.setAccessible(true);Object value = name.get(s);System.out.println(value);//修改值name.set(s,"王五");System.out.println(s);}
}

Student.java
package reflect;import java.io.IOError;
import java.io.IOException;public class Student {private String name;private int age;public String gender;public Student(String name, int age,String gender) {this.name = name;this.age = age;this.gender = gender;}public Student() {}public String getName() {return name;}public String getGender() {return gender;}public void setName(String name) {this.name = name;}public void setGender(String gender) {this.gender = gender;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public void sleep(){System.out.println("睡觉");}public void eat(String something,int a){System.out.println("吃" + something);}public String eat(String something) throws IOException {System.out.println("吃" + something);return "man what can i say";}@Overridepublic String toString() {return "Student{name='" + name + "', age=" + age + ", gender='" + gender + "'}";}
}

Demo.java
 

package reflect;import javax.swing.text.Style;
import java.lang.reflect.*;
import java.util.Objects;public class demo {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, NoSuchFieldException, IllegalAccessException, InvocationTargetException {/*获取class成员方法的三种方法1.Method[] getMethods()返回所有公共方法对象数组2.Method[] getDeclaredMethods()返回所有成员变量对象数组3.Method[] getMethod(String name,class<?>)返回单个公共成员变量对象4.Method[] getDeclaredMethod(String name,class<?>)返回单个成员变量对象*///1.获取字节码文件对象Class cls = Class.forName("reflect.Student");//2.获取方法对象(私有)
//        Method[] methods = cls.getMethods();
//        for(Method method : methods){
//            System.out.println(method);
//        }Method m = cls.getDeclaredMethod("eat", String.class);System.out.println(m);//获取方法修饰符int modifiers = m.getModifiers();System.out.println(modifiers);//获取方法名字String name = m.getName();System.out.println(name);//方法形参Parameter[] parameters = m.getParameters();for(Parameter parameter : parameters){System.out.println(parameter);}//方法抛出与异常Class [] exceptionTypes = m.getExceptionTypes();for(Class exceptionType : exceptionTypes){System.out.println(exceptionType);}//方法运行/*参数一:obj调用方法参数二:调用方法传递的参数返回值:方法的返回值*/Student s = new Student();//参数一s,调用者  二 红烧肉 实参m.setAccessible(true);Object result = m.invoke(s,"红烧肉");//返回值System.out.println(result);}
}


http://www.hkcw.cn/article/fkUQmeNybF.shtml

相关文章

教育部开通2025高考举报电话 欢迎举报问题线索

近日,教育部公布了2025年高考举报电话,覆盖教育部及各省(区、市)。欢迎广大考生、家长和社会各界人士举报涉及2025年高考的问题线索。相关部门将根据举报线索迅速核查处理,坚决维护高考的公平公正。责任编辑:zhangxiaohua

揭秘绿发会与蒋雨融父亲关联 家庭背景引争议

近日,蒋雨融因在哈佛大学2025年毕业典礼上的发言和家庭背景引发争议。2022年3月,绿发会曾公开发布推文称,时任副理事长兼秘书长的周晋峰推荐了长期志愿者蒋雨融进入哈佛大学肯尼迪学院,蒋雨融的父亲蒋志明对此表示感谢。目前,在绿发会的公众号和微博账号搜索“蒋雨融”,均…

Alist Win 基本用法

1&#xff1a;Alist 简介 Alist 是一个支持多种存储的文件列表程序&#xff0c;具体使用方式可参考 https://alistgo.com/zh/。 使用指南&#xff1a;https://alistgo.com/zh/guide/ 配置指南&#xff1a;https://alistgo.com/zh/config/ 2&#xff1a;Alist 部署 2.1&…

YOLOv10改进|爆改模型|涨点|C2F引入空间和通道注意力模块暴力涨点(附代码+修改教程)

一、文本介绍 本文修改的模型是YOLOv10&#xff0c;YOLOv10无需非极大值抑制&#xff08;NMS&#xff09;进行后处理&#xff0c;其推理速度以及参数量上都优于现有的模型。C2f (Cross-Stage Partial-Connection with 2 convolutions) 模块是YOLOv6中引入的一种结构&#xff0…

38岁男子酒后拖拽6岁女童进巷被拘 警方迅速行动控制嫌疑人

警情通报2025年5月20日下午,嫌疑人刘某某(男,38岁)酒后行至娄底市娄星区涟滨中街附近,拖拽一名6岁女童进入居民区巷子,被居民及时制止并报警。接警后,民警迅速赶到现场将刘某某控制。经侦查,刘某某涉嫌寻衅滋事已被拘留,并将依法追究其刑事责任。公安机关坚决依法打击…

隔离防护产品防晒有效果吗 选购需谨慎

夏日来临,防晒化妆品迎来销售高峰。不少商家打出“防护+修复”的宣传口号,声称产品既能防晒,又能美白修复。然而,消费者购买使用后却发现,这些所谓“多效合一”的产品,其实很多都只是普通的化妆品。在北京多家日化用品销售店,防晒霜、防晒喷雾等产品被摆在最显眼的位置。…

俄将向乌移交6000具阵亡士兵遗体 谈判达成一致

俄罗斯与乌克兰两国代表团于6月2日在土耳其伊斯坦布尔进行了第二轮直接谈判。双方就交换阵亡士兵遗体及新一轮换俘达成一致。谈判持续了约1小时,俄罗斯总统助理、俄方谈判代表团团长梅金斯基表示,俄方将在下周单方面向乌方移交6000具阵亡士兵遗体。梅金斯基还提到,俄乌将成立…

计算机视觉---深度学习框架(Backbone、Neck、Head)

一、主干&#xff08;Backbone&#xff09;&#xff1a;视觉特征的“根基” 1. 核心定位与功能 定义&#xff1a; 作为网络的底层基础&#xff0c;主干负责从输入图像中提取多层次、多尺度的视觉特征&#xff0c;其输出的特征图&#xff08;Feature Map&#xff09;需兼顾空间…

使用Cursor自动创建Dify工作流

一、背景 AI时代&#xff0c;使用自然语言进行编程&#xff0c;让开发变成聊天一样容易。提升我们的效率&#xff0c;复杂的、重复性的工作交给AI 工具来做&#xff0c;本次尝试使用cursor自动创建dify工作流。 二、准备工作&#xff1a; 本地安装Cursor开发工具&#xff08…

泡泡玛特续创新高 市值突破3100亿港元

泡泡玛特(9992.HK)股价继续走强,盘中一度上涨2.43%,达到235.6港元,创下历史新高,市值突破3100亿港元。今年以来,该股累计涨幅超过160%。摩根大通发布报告表示,对中国IP产业的乐观前景更加有信心,将泡泡玛特列为首选之一,并给予“增持”评级。尽管大多数企业尚未见到显…

7人停车场殴打未成年 警方:全部抓获 因误会引发冲突

四川古蔺县警方通报了一起涉及未成年人的暴力事件。6月2日,两名未成年人骑车时发出笑声,被15岁的陈某甲误以为是在嘲笑自己。随后,陈某甲和其他六人在地下停车场对这两名未成年人进行了殴打。目前,七名涉事人员均已被警方抓获,其中两人已被刑事拘留。责任编辑:zhangxiaoh…

Python-matplotlib库画不规则图

matplotlib库之画不规则图 subplot2grid()实现灵活的网格布局GridSpec基本参数 简单的不规则 在 Matplotlib 中绘制不规则排列的图形&#xff08;如大小不同、跨行跨列的子图&#xff09; subplot2grid()实现灵活的网格布局 &#x1f3f5;️ 通过指定子图跨越的行数和列数实现…

abandon便签:一个免费好用审美在线的桌面便签应用

abandon便签&#xff1a;一个免费好用审美在线的桌面便签应用 项目gitee地址&#xff1a;abandon便签: 一个免费好用审美在线的桌面便签应用 下载链接&#xff1a;点我下载软件压缩包 注&#xff1a;下载压缩包后&#xff0c;解压即可。 项目初衷&#xff1a; 前段时间辞职&…

CppCon 2014 学习:(Costless)Software Abstractions for Parallel Architectures

硬件和科学计算的演变关系&#xff1a; 几十年来的硬件进步&#xff1a;计算机硬件不断快速发展&#xff0c;从提升单核速度&#xff0c;到多核并行。科学计算的驱动力&#xff1a;科学计算需求推动硬件创新&#xff0c;比如需要更多计算能力、更高性能。当前的解决方案是并行…

【MySQL】使用C语言连接数据库

目录 一、准备工作 二、数据表操作 &#xff08;一&#xff09;初始化数据库 &#xff08;二&#xff09;连接数据库 &#xff08;三&#xff09;设置字符集 &#xff08;四&#xff09;操作数据表 1、插入数据 2、删除数据 3、更新数据 4、查询数据 一、准备工作 在之…

高效会议记录工具使用指南

软件介绍 本文介绍一款名为"吗喽会议"的安卓平台会议记录软件&#xff0c;经过测试体验非常出色&#xff0c;特向大家推荐。 软件定位与核心功能 这是一款专为职场人士设计的会议记录应用程序&#xff0c;其核心优势在于强大的语音识别能力&#xff0c;能够实时将…

基于vue3-elemenyui的页面加载及新建浏览页案例

1.参考链接&#xff1a; 基于创建vue3链接&#xff1a;Vue3前端项目创建_vscode创建vue3项目-CSDN博客 基于创建elementui链接&#xff1a;Vue3引入ElementPlus_vue引入element-plus-CSDN博客 2.案例内容 该案例实现了基本的app.vue的路由跳转、新建浏览页参数传入以及浏览…

详解|证券、基金、期货:银证转账系统

Hi,围炉喝茶聊产品的新老朋友好!在话题未开始之前,先看组见证历史数据:2024年国庆节前,沪深两市成交额连续多日突破万亿。今日开盘后仅20分钟,沪深两市成交额突破1万亿元,刷新此前9月30日创下的历史最快万亿纪录。大量资金需要从银行存管账户转入证券存管账户。银行端和…

香港警方回应恒生银行抢劫案 嫌疑人暂未落网

香港一家恒生银行日前发生持刀抢劫案,持续引发关注。6月2日17时许,一名男子独自进入香港恒生银行沙田第一城分行,坐下约15分钟后突然拿出一把刀,威胁一名女性银行职员,并劫走约30余万港元及少量外币后逃离现场。案件导致一名银行职员颈部受轻伤,送往医院治疗后已出院,其…

政策朝令夕改 美国正在失去方向 关税政策摇摆不定

5月30日,美国总统特朗普宣布将进口钢铝关税上调至50%。短短几天内,美国关税政策再度急转弯,三项法院裁决让白宫主导的关税博弈更加复杂。美国国际贸易法院叫停大多数关税措施后,联邦巡回上诉法院暂时搁置“叫停令”。随后,一家联邦法院裁定总统无权利用“紧急权力”加征关…