Java:通过class名称字符串改变静态变量的值

Java: Change value of static variable by class name string

我有一个大型 Java 项目的以下结构:

Class BigParentClass
{
...
};

然后是许多扩展此 BigParentClass 的 classes,所有这些都具有相同的静态变量。

Class A extends BigParentClass 
{
    static boolean importantVal = false;
};

Class B extends BigParentClass
{
    static boolean importantVal = false;
}
..etc..

我需要做的是,在初始化期间,我将获得一个 class 名称字符串列表,我需要在其中将静态变量 importantVal 设置为 TRUE。所以我会得到一个列表,例如:

"A, C, F, K"

我需要一种方法来将 classes A、C、F、K 的静态变量更改为 TRUE。这样做的方法是什么?

我试过做类似的事情:

Class strToClass = Class.forName(classNameString);

但是,如果不将 Class 变量强制转换为拥有它的实际 class,则无法引用 "importantVal" 静态变量。我是否需要减少损失,并为我的所有 classes 准备一个 switch 语句来进行我需要的更改:

Class class = Class.forName(classNameString);
switch(class)
{
    case A:
        (A)class.importantVal = true;
        break;
    case B:
        (B)class.importantVal = true;
        break;
    ..etc..
}

您可以只对 class 对象本身使用 getDeclaredField 方法和 set,因为它是一个静态字段。

Class<?> clazz = Class.forName("MyClass");
clazz.getDeclaredField("importantVal").set(null, true);

因此,在您的迭代中:

for (String fullyQualifiedClassName: myIterable) {
    try {
        Class
            .forName(fullyQualifiedClassName)
            .getDeclaredField("importantVal").set(null, true);
    }
    // java 7 idiom here to simplify
    catch (ClassNotFoundException | NoSuchFieldException | 
           IllegalAccessException | IllegalArgumentException e) {
        // TODO handle
    }
}

这闻起来像是糟糕的设计。不要设置其他 classes 的字段,而是让每个 class 通过引入初始配置来设置自己的值:

public class InitialConfig {
    public static Collection<String> importantValueEnabledClassNames() {
        // Read class name strings here
    }
}

public class A extends BigParentClass {
    static final boolean importantVal =
        InitialConfig.importantValueEnabledClassNames().contains(
            A.class.getName());
}

public class B extends BigParentClass {
    static final boolean importantVal =
        InitialConfig.importantValueEnabledClassNames().contains(
            B.class.getName());
}