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

发布时间:2023年12月26日

1. 概念

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

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

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

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

具体的比较:

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

2. getFields()方法

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()方法

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():获取某个类的自身的所有字段,不包括父类的字段。

具体代码可看如下:


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());
		}
	}
}

截图如下:

在这里插入图片描述

文章来源:https://blog.csdn.net/weixin_47872288/article/details/135202102
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。