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

目录

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

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

截图如下:

浅谈Java反射中的getFields()方法和getDeclaredFields ()方法_第1张图片

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

截图如下:

浅谈Java反射中的getFields()方法和getDeclaredFields ()方法_第2张图片

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

截图如下:

浅谈Java反射中的getFields()方法和getDeclaredFields ()方法_第3张图片

你可能感兴趣的:(java,java,开发语言,反射)