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