Java:按类名字符串

时间:2016-06-02 15:43:39

标签: java class static-variables

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

Class BigParentClass
{
...
};

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

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

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

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

“A,C,F,K”

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

我尝试过这样的事情:

Class strToClass = Class.forName(classNameString);

但是,没有办法引用“importantVal”静态变量而不将该类变量强制转换为具有它的实际类。我是否需要减少损失,并为我的所有课程提供切换声明,以便进行我需要的更改:

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

2 个答案:

答案 0 :(得分:1)

您可以在类对象本身上使用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
    }
}

答案 1 :(得分:0)

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

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