Java:如何获取 class 中所有静态字段的列表

Java: how to get a list of all static fields within a class

是否可以在 class 中自动列出其所有静态字段,即无需我自己明确将它们添加到列表中?

例如:我有一个基础 class Vehicle,其中包含许多 class 字段,这些字段派生 classes (Car, Truck, Van).如何在不必手动添加每个 CarTruck 等的情况下填充字段 VEHICLES?这可能吗?

public class Vehicle {
    public static final Car a = new Car(...);
    public static final Car b = new Car(...);
    public static final Truck c = new Truck(...);
    ...
    public static final Van d = new Van(...);
    
    public static FINAL List<Vehicle> VEHICLES;
    static {
        VEHICLES = new ArrayList<>();
        // Add all static fields here   
    }

而且,更具体地说,我是否能够列出每个派生的 class,就像这样

    public static FINAL List<Car> CARS; // populate with all static fields of class Car
    public static FINAL List<Truck> TRUCKS; // populate with all static fields of class Truck
    ...

我做了一些搜索,似乎反思可能是可行的方法(例如,this and this 问题的方向是正确的)- 但我不知道如何 'translate' 将字段添加到对象中并添加它们(如果可能的话):

    public static Field[] fields; 
    static {
        fields = Vehicle.class.getDeclaredFields();
        for (Field f : fields) {
            VEHICLES.add(...); // to add any Vehicle
            if (f.getType().isInstance(Car.class)) {
                CARS.add(...); // to add all Cars
            }
        }
    }

我离题了吗,是否应该完全不同地做?或者这是不可能的,或者甚至是代码味道?

我想说这绝对是一种代码味道,因为在常规项目中应该小心使用反射(我所说的常规是指除了像 Spring 这样的框架之外的所有项目)。

但如果您想使用它,请按以下步骤操作

class Vehicle {
  public static final Car a = new Car();
  public static final Car b = new Car();
  public static final Truck c = new Truck();

  public static final List<Vehicle> VEHICLES;

  static {
    VEHICLES = new ArrayList<>();
    Field[] declaredFields = Vehicle.class.getDeclaredFields();
    for (Field field : declaredFields) {
      if (java.lang.reflect.Modifier.isStatic(field.getModifiers())) {
        if (Vehicle.class.isAssignableFrom(field.getType())) {
          try {
            VEHICLES.add((Vehicle) field.get(null));
          } catch (IllegalAccessException e) {
            e.printStackTrace();
          }
        }
      }
    }
  }
}