我有一个大型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..
}
答案 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());
}