Java:如何获取 class 中所有静态字段的列表
Java: how to get a list of all static fields within a class
是否可以在 class 中自动列出其所有静态字段,即无需我自己明确将它们添加到列表中?
例如:我有一个基础 class Vehicle
,其中包含许多 class 字段,这些字段派生 classes (Car
, Truck
, Van
).如何在不必手动添加每个 Car
、Truck
等的情况下填充字段 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();
}
}
}
}
}
}
是否可以在 class 中自动列出其所有静态字段,即无需我自己明确将它们添加到列表中?
例如:我有一个基础 class Vehicle
,其中包含许多 class 字段,这些字段派生 classes (Car
, Truck
, Van
).如何在不必手动添加每个 Car
、Truck
等的情况下填充字段 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();
}
}
}
}
}
}