浅谈Java反射中的getFields()方法和getDeclaredFields ()方法

news/2024/5/19 2:26:58 标签: java, 开发语言, 反射

目录

  • 1. 概念
  • 2. getFields()方法
  • 2. getDeclaredFields()方法
  • 4. 总结

1. 概念

反射是Java中一种强大的机制,允许在运行时获取、检查和操作类、方法、字段等信息,而不需要在编译时知道这些信息。

其中字段(Field)在Java中是类中用于存储数据的成员变量。在反射中,可以通过Field类获取和操作类的字段。

  • getFields(): 该方法用于获取某个类及其父类中所有的公有字段。公有字段是指用public修饰的字段。
    这个方法对于需要获取类的公有属性时很有用,例如在某些框架或通用库中。

  • getDeclaredFields(): 该方法用于获取某个类中声明的所有字段,包括公有、私有、受保护的字段,但不包括继承的字段。
    这个方法对于需要获取类的所有字段时很有用,尤其是在进行一些高级的操作时。

具体的比较:

方法示例优点缺点场景
getFields()Field[] fields = MyClass.class.getFields();简单易用,一次性获取类及其父类的所有公有字段。不能获取私有字段,且只能获取到从父类继承而来的公有字段,不包括类本身声明的非公有字段。当只关心类及其父类的公有字段,不需要考虑私有字段时
getDeclaredFields()Field[] fields = MyClass.class.getDeclaredFields();能够获取类中声明的所有字段,包括公有、私有、受保护的字段。不能获取父类的字段,如果需要获取父类的字段,必须迭代遍历父类。当需要获取类中声明的所有字段,包括私有字段时,或者需要更多字段的信息时。

2. getFields()方法

java">import java.lang.reflect.Field;

public class test1 {
	public int publicField;
	private String privateField;

	public static void main(String[] args) {

//		Class<?> myClass = test1.class;
		// 获取所有公有字段
		Field[] fields = test1.class.getFields();

		for (Field field : fields) {
			System.out.println("Public Field: " + field.getName());
		}
	}
}

截图如下:

在这里插入图片描述

2. getDeclaredFields()方法

java">import java.lang.reflect.Field;

public class test1 {
	public int publicField;
	private String privateField;

	public static void main(String[] args) {

//		Class<?> myClass = test1.class;
		// 获取所有公有字段
		Field[] fields = test1.class.getDeclaredFields();

		for (Field field : fields) {
			System.out.println("Field: " + field.getName());
		}
	}
}

截图如下:

在这里插入图片描述

4. 总结

  • getFields(): 获取某个类的所有的public字段,其中是包括父类的public字段的。

  • getDeclaredFields():获取某个类的自身的所有字段,不包括父类的字段。

具体代码可看如下:

java">
import java.lang.reflect.Field;

// 父类
class ParentClass {
	public int parentPublicField;
	private String parentPrivateField;
}

// 子类继承父类

class ChildClass extends ParentClass {
	public String childPublicField;
	private int childPrivateField;
}

public class test1 {
	public static void main(String[] args) {

		// 获取子类的Class对象
		Class<?> childClass = ChildClass.class;

		System.out.println("Using getFields():");
		// 获取子类及其父类的所有公有字段
		Field[] publicFields = childClass.getFields();
		for (Field field : publicFields) {
			System.out.println("Public Field: " + field.getName());
		}

		System.out.println("\nUsing getDeclaredFields():");
		// 获取子类中声明的所有字段,包括公有、私有、受保护的字段
		Field[] declaredFields = childClass.getDeclaredFields();
		for (Field field : declaredFields) {

			System.out.println("Field: " + field.getName());
		}
	}
}

截图如下:

在这里插入图片描述


http://www.niftyadmin.cn/n/5287474.html

相关文章

django之drf框架(两个视图基类、5个扩展视图类、9个视图子类)

两个视图基类 APIView和GenericAPIView drf提供的最顶层的父类就是APIView&#xff0c;以后所有的类都继承自他 GenericAPIView继承自APIView&#xff0c;他里面封装了一些工能 基于APIViewModelSerializerResposne写5个接口 子路由&#xff1a;app01>>>urls.py …

【UniApp】-uni-app-处理项目输入数据(苹果计算器)

前言 上一篇文章完成了项目的基本布局&#xff0c;这一篇文章我们来处理一下项目的输入数据项目的输入数据主要是通过按键来输入的&#xff0c;所以我们需要对按键进行处理那么我们就来看一下 uni-app-处理项目输入数据 步入正题 在上篇文章中&#xff0c;我在 data 中定义了一…

【Qt-布局】

Qt编程指南 ■ QGridLayout■ QFormLayout■■ ■ QGridLayout MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {/* 设置位置与大小 */this->setGeometry(0, 0, 800, 480);/* 实例化 */gWidget new QWidget(this);/* 设置gWidget居中央 */this->set…

Android 手机对于Arduino蓝牙控制解决方案

1、Android系统概述 ​ Android 系统是 Google 公司基于 Linux 内核开发的移动端操作系统,适用于智能手机智能手表平板电脑等设备&#xff0c;最新的版本为 7.1。Android系统具有免费开源的优势,任何企业与个人都可以查阅公开的 API 文档&#xff0c;并在自己开发的应用中通过调…

实习知识整理6:前后端利用jQuery $.ajax数据传输的四种方式

方式1&#xff1a;前端发送key/value(String字符串)&#xff0c;后台返回文本 前端&#xff1a; <input id"test1" type"button" value"前端发送key/value(String字符串)&#xff0c;后台返回文本"/> $(function() {$("#test1&quo…

android---Jetpack Compose 学习001

Compose 是什么 Jetpack Compose 是用于构建原生 Android 界面的新工具包。它可简化并加快 Android 上的界面开发&#xff0c;帮助您使用更少的代码、强大的工具和直观的 Kotlin API&#xff0c;快速打造生动而精彩的应用。 Compose 的优势 1. 更少的代码。使用更少的代码实…

算法练习Day20 (Leetcode/Python-回溯算法)

虽然看似进入了一个新章节&#xff0c;但其实还是前几天二叉树章节的延续。。 回溯算法 &#xff08;以下内容摘抄自代码随想录&#xff09;&#xff1a; 回溯法解决的问题都可以抽象为树形结构&#xff0c;是的&#xff0c;我指的是所有回溯法的问题都可以抽象为树形结构&…

CSS新手入门笔记整理:动画

在CSS3中&#xff0c;我们可以使用animation属性来实现元素的动画效果。animation属性和transition属性的区别。 transition属性只能将元素的某一个属性从一个属性值过渡到另一个属性值。只能实现一次性的动画效果。animation属性来可以将元素的某一个属性从第1个属性值过渡到…