Java反射常用方法
反射
作用:
- 对于任意一个对象,把对象所有的字段名和值,保存到文件中去
- 利用反射动态的创造对象和运行方法
1. 获取字节码文件对象
| 方法 | 描述 |
|---|---|
Class.forName(String) | 通过类的全限定名字符串获取字节码文件对象。 |
| 类字面量 | 直接使用类的字面量获取字节码文件对象。 |
| 对象的方式 | 当已经有类的对象时,通过对象的 getClass() 方法获取字节码文件对象。 |
public class ReflectDemo1 {public static void main(String[] args) throws ClassNotFoundException {// 最常用的方式Class clazz = Class.forName("Student");System.out.println(clazz);// 一般通过参数传递的方式Class clazz2 = Student.class;System.out.println(clazz2);System.out.println(clazz==clazz);// 通过对象的方式,有类的对象时才可以使用Student s = new Student();Class clazz3 = s.getClass();System.out.println(clazz3);System.out.println(clazz2==clazz3);}
}
2. 利用反射获得构造方法
| 方法 | 描述 |
|---|---|
Class.forName(String) | 通过类的全限定名字符串获取字节码文件对象。 |
Class.getConstructors() | 获取公共的构造方法。 |
Class.getDeclaredConstructors() | 获取所有构造方法,包括私有的构造方法。 |
Class.getConstructor(Class...) | 获取指定参数类型的公共构造方法。 |
Class.getDeclaredConstructor(Class...) | 获取指定参数类型的构造方法,包括私有的构造方法。 |
Constructor.getModifiers() | 获取构造方法的修饰符。 |
Constructor.getParameters() | 获取构造方法的参数。 |
Constructor.newInstance(Object...) | 通过构造方法创建类的实例。 |
Constructor.setAccessible(true) | 设置私有构造方法可访问。 |
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Parameter;public class ReflectDemo2 {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {// 1. 获取Class字节码文件对象Class clazz = Class.forName("Student");// 2. 获取所有的构造方法Constructor[] cons = clazz.getConstructors();for (Constructor con: cons) {System.out.println(con);}System.out.println("------------");// 获取所有的构造方法,包括私有的Constructor[] cons2 = clazz.getDeclaredConstructors();for (Constructor con: cons2) {System.out.println(con);}System.out.println("------------");// 获取指定的构造方法Constructor con3 = clazz.getConstructor(String.class);System.out.println(con3);System.out.println("------------");Constructor con4 = clazz.getDeclaredConstructor(int.class);System.out.println(con4);System.out.println("------------");Constructor con5 = clazz.getDeclaredConstructor(String.class, int.class);System.out.println(con5);System.out.println("------------");// 获取构造方法的权限修饰符int modifiers = con5.getModifiers();System.out.println(modifiers);Parameter[] parameters = con5.getParameters();for (Parameter parameter: parameters) {System.out.println(parameter);}con5.setAccessible(true); // 设置私有构造方法可访问Student stu = (Student) con5.newInstance("张三", 23);System.out.println(stu);}
}
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 String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}
3. 利用反射获取成员变量
| 方法 | 描述 |
|---|---|
Class.getFields() | 获取公共的成员变量。 |
Class.getDeclaredFields() | 获取所有的成员变量,包括私有的成员变量。 |
Class.getField(String) | 获取指定名称的公共成员变量。 |
Class.getDeclaredField(String) | 获取指定名称的成员变量,包括私有的成员变量。 |
Field.getModifiers() | 获取成员变量的权限修饰符。 |
Field.get(Object) | 获取指定对象上此 Field 表示的字段的值。 |
Field.setAccessible(true) | 设置私有成员变量可访问。 |
Field.set(Object, Object) | 将指定对象参数上此 Field 表示的字段设置为指定的新值。 |
import java.lang.reflect.Field;public class ReflectDemo3 {public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {// 利用反射获取成员变量Class clazz = Class.forName("Student");// 获取所有的成员变量Field[] fields = clazz.getFields();for (Field field: fields) {System.out.println(field);}System.out.printf("------------\n");// 获取所有的成员变量,包括私有的Field[] fields2 = clazz.getDeclaredFields();for (Field field: fields2) {System.out.println(field);}System.out.printf("------------\n");// 获取指定的成员变量Field field3 = clazz.getField("gender");// 获取私有的成员变量Field name = clazz.getDeclaredField("name");System.out.println(field3);System.out.println(name);// 获取权限修饰符int modifiers = field3.getModifiers();int modifiers2 = name.getModifiers();System.out.println(modifiers);System.out.println(modifiers2);System.out.println("------------");// 获取成员变量的值Student s = new Student("张三", 23);name.setAccessible(true); // 设置私有成员变量可访问Object value = name.get(s);System.out.println(value);// 修改对象记录的值name.set(s, "李四");System.out.println(s);}
}
public class Student {private String name;private int age;public String gender;public Student() {}public Student(String name) {this.name = name;}protected Student(int age) {this.age = age;}public Student(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}
4. 获取成员方法
| 方法名 | 说明 |
|---|---|
| Method[] getMethods() | 返回所有成员方法对象的数组(只能拿public的) |
| Method[] getDeclaredMethods() | 返回所有成员方法对象的数组,存在就能拿到 |
| Method getMethod(String name, Class<?>… parameterTypes) | 返回单个成员方法对象(只能拿public的) |
| Method getDeclaredMethod(String name, Class<?>… parameterTypes) | 返回单个成员方法对象,存在就能拿到 |
import java.lang.reflect.Method;public class ReflectMethodExample {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {// 获取Class对象Class<?> clazz = Class.forName("MyClass");// 获取所有公共成员方法Method[] methods = clazz.getMethods();System.out.println("公共成员方法:");for (Method method : methods) {System.out.println(method);}System.out.println("-------------");// 获取所有成员方法,包括私有的Method[] declaredMethods = clazz.getDeclaredMethods();System.out.println("所有成员方法:");for (Method method : declaredMethods) {System.out.println(method);}System.out.println("-------------");// 获取指定的公共成员方法Method publicMethod = clazz.getMethod("publicMethod");System.out.println("指定的公共成员方法:");System.out.println(publicMethod);System.out.println("-------------");// 获取指定的成员方法,包括私有的Method privateMethod = clazz.getDeclaredMethod("privateMethod");System.out.println("指定的成员方法:");System.out.println(privateMethod);}
}class MyClass {public void publicMethod() {System.out.println("This is a public method.");}private void privateMethod() {System.out.println("This is a private method.");}
}
相关文章:
Java反射常用方法
反射 作用: 对于任意一个对象,把对象所有的字段名和值,保存到文件中去利用反射动态的创造对象和运行方法 1. 获取字节码文件对象 方法描述Class.forName(String)通过类的全限定名字符串获取字节码文件对象。类字面量直接使用类的字面量获…...
go语言实现无头单向链表
什么是无头单向链表 无头单向链表是一种线性数据结构,它的每个元素都是一个节点,每个节点都有一个指向下一个节点的指针。"无头"意味着这个链表没有一个特殊的头节点,链表的第一个节点就是链表的头。 优点: 动态大小&…...
SpringBoot快速入门笔记(5)
文章目录 一、elemetnUI1、main.js2、App.vue3、fontAwesome 一、elemetnUI 开源前端框架,安装 npm i element-ui -S 建议查看官方文档 Element组件,这里是Vue2搭配elementUI,如果是vue3就搭配elementPlus,这里初学就以Vue2为例子…...
solidity(3)
地址类型 pragma solidity ^0.8.0;contract AddressExample {// 地址address public _address 0x7A58c0Be72BE218B41C608b7Fe7C5bB630736C71;address payable public _address1 payable(_address); // payable address,可以转账、查余额// 地址类型的成员uint256…...
笔记 | 编译原理L1
重点关注过程式程序设计语言编译程序的构造原理和技术 1 程序设计语言 1.1 依据不同范型 过程式(Procedural programming languages–imperative)函数式(Functional programming languages–declarative)逻辑式(Logical programming languages–declarative)对象式(Object-or…...
k8s存储卷 PV与PVC 理论学习
介绍 存储的管理是一个与计算实例的管理完全不同的问题。PersistentVolume 子系统为用户和管理员提供了一组 API,将存储如何制备的细节从其如何被使用中抽象出来。为了实现这点,我们引入了两个新的 API 资源:PersistentVolume 和 Persistent…...
【WPF应用32】WPF中的DataGrid控件详解与示例
在WPF(Windows Presentation Foundation)开发中,DataGrid控件是一个强大的数据绑定工具,它以表格的形式展示数据,并支持复杂的编辑、排序、过滤和分组等操作。在本文中,我们将详细介绍DataGrid控件的功能、…...
numpy,matplotilib学习(菜鸟教程)
所有内容均来自于: NumPy 教程 | 菜鸟教程 Matplotlib 教程 | 菜鸟教程 numpy模块 numpy.nditer NumPy 迭代器对象 numpy.nditer 提供了一种灵活访问一个或者多个数组元素的方式。 for x in np.nditer(a, orderF):Fortran order,即是列序优先&#x…...
Web API(四)之日期对象节点操作js插件重绘和回流
Web API(四)之日期对象&节点操作&js插件&重绘和回流 日期对象实例化方法时间戳DOM 节点插入节点删除节点查找节点父子关系兄弟关系M端事件js插件重绘和回流进一步学习 DOM 相关知识,实现可交互的网页特效 能够插入、删除和替换元素节点能够依据元素节点关系查找…...
27.WEB渗透测试-数据传输与加解密(1)
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:26.WEB渗透测试-BurpSuite(五) BP抓包网站网址:http:…...
山寨windows
我的目标是能够运行windows 下的大部分PE格式的程序,这一点通过实验已经证明完全是可行的。 PE格式主要有exe dll sys等文件,这三个文件可以用相同的函数解析, 主要有以下段组成, 1、文件头,包含DOS文件头、PE文件头…...
unity工程输出的log在哪里?
在编辑器里进行活动输出的log位置: C:\Users\username\AppData\Local\Unity\Editor\Editor.log ------------------------------------ 已经打包完成,形成的exe运行后的log位置: C:\Users\xxx用户\AppData\LocalLow\xx公司\xx项目...
【力扣】7. 整数反转
7. 整数反转 题目描述 给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。 假设环境不允许存储 64 位整数(有符号或无符号)。 …...
Android Apk签名算法使用SHA256
Android apk签名算法使用SHA256 本文不介绍复杂的签名过程,说一下Android签名算法使用SHA256。 但是SHA1不是相对安全签名算法,SHA256更加安全一些。 一般大公司才会有这种细致的安全要求。 如何查看apk签名是否是SHA1还是SHA256 1、拿到apk文件&…...
2024.3.13力扣每日一题——最大二进制奇数
2024.3.13 题目来源我的题解方法一 贪心 题目来源 力扣每日一题;题序:2864 我的题解 方法一 贪心 统计1的个数,满足要求的字符串的末尾一位一定是1,所以需要将一位1放到末尾,然后将剩余的1从最高位开始放࿰…...
2024.4.1力扣每日一题——故障键盘
2024.4.1 题目来源我的题解方法一 直接利用StringBuilder的反转函数方法二 字符数组 题目来源 力扣每日一题;题序:2810 我的题解 方法一 直接利用StringBuilder的反转函数 使用StringBuilder构造结果,并利用其反转函数进行翻转 时间复杂度…...
第十四届蓝桥杯C/C++大学B组题解(一)
1、日期统计 #include <bits/stdc.h> using namespace std; int main() {int array[100] {5, 6, 8, 6, 9, 1, 6, 1, 2, 4, 9, 1, 9, 8, 2, 3, 6, 4, 7, 7,5, 9, 5, 0, 3, 8, 7, 5, 8, 1, 5, 8, 6, 1, 8, 3, 0, 3, 7, 9,2, 7, 0, 5, 8, 8, 5, 7, 0, 9, 9, 1, 9, 4, 4, 6,…...
4.网络编程-websocket(golang)
目录 什么是websocket golang中使用websocket Server端 Client端 什么是websocket WebSocket是一种在互联网上提供全双工通信的协议,即允许服务器和客户端之间进行双向实时通信的网络技术。它是作为HTML5的一部分标准化的,旨在解决传统HTTP协议在实…...
docker安装部署mysql后忘记root密码
应用场景是:用docker安装完mysql后,使用安装时候设置的密码登录不上MySQL; 1、修改docker映射出mysql的配置文件:my.cnf 在mysqld最下方添加skip-grant-tables进入安全模式(随意一个密码即可登录mysql) [m…...
c++的学习之路:14、list(1)
本章讲一下如何使用list,代码在文章末 目录 一、list介绍 二、增 三、删 四、查和改 五、交换 六、代码 一、list介绍 首先还是看一看官方文档的介绍如下图,如下方五点: 1. list是可以在常数范围内在任意位置进行插入和删除的序列式…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...
PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...
《Offer来了:Java面试核心知识点精讲》大纲
文章目录 一、《Offer来了:Java面试核心知识点精讲》的典型大纲框架Java基础并发编程JVM原理数据库与缓存分布式架构系统设计二、《Offer来了:Java面试核心知识点精讲(原理篇)》技术文章大纲核心主题:Java基础原理与面试高频考点Java虚拟机(JVM)原理Java并发编程原理Jav…...
