如何通过其他变量从 java class 访问常量?
How to access constants from a java class through other variable?
我有 java class,它具有下面给出的所有常量:
public final class CategoryIDs {
public static final String Extraction_of_natural_gas = "1111";
public static final String Mining_of_hard_coal = "2222";
public static final String Mining_of_iron_ores = "3333";
public static final String Mining_of_lignite = "4444";
}
现在我想通过一个保存变量名称的变量访问其他class中的这些常量。
例如:
String temp = "Extraction_of_natural_gas";
使用这个 temp 变量我想从 class 上面访问常量。但是我不能做 CategoryIDs.temp 因为这是不允许的。那么实现这一目标的最佳方法是什么?
可以使用反射提取:
String value = (String) CategoryIDs.class.getField(temp).get(null);
传递给 get
的 null
参数表示这是一个静态字段,不需要实例来获取它的值。
请注意,此技术很容易出错。上面的代码不包含任何错误检查或异常处理以使其更易于阅读,但真正的应用程序可能应该包含它们。
如果你真的、真的需要用你当前的结构来做这件事,你可以使用反射。
但是,您可能会发现枚举更合适。类似于:
public enum CategoryID {
EXTRACTION_OF_NATURAL_GAS("Extraction_of_natural_gas", 1111),
MINING_OF_HARD_COAL("Mining_of_hard_coal", 2222),
MINING_OF_IRON_ORES("Mining_of_iron_ores", 3333),
MINING_OF_LIGNITE("Mining_of_lignite", 4444);
private static final Map<String, CategoryID> keyMap;
static {
keyMap = new HashMap<>();
for (CategoryID category : CategoryID.values()) {
keyMap.put(category.getKey(), category);
}
}
private final String key;
private final int value;
public int getValue() {
return value;
}
public String getKey() {
return key;
}
private CategoryID(String key, int value) {
this.key = key;
this.value = value;
}
public static CategoryID fromKey(String key) {
return keyMap.get(key);
}
}
这种方法的好处:
- 您将代码中的名称(现在 Java 更常规)与您在数据中提供的键分开。这意味着您可以在数据中使用任何您喜欢的键,包括带有空格的键等。它们不再需要是有效的标识符。
- 当您从代码中引用枚举值时,您仍然可以获得编译时安全性。
- 您将获得 更好 的安全性,因为您永远不会不小心使用字符串而不是类别 ID,您可以使用常量轻松完成。
我认为你正在寻找内省。这是反射的 "read only" 部分,您可以在其中检索对象的值。
代码如下,为了便于理解,拼凑起来:
Object value = null;
String constName = "Bar";
Field constant = Foo.class.getField( constName );
if ( constant != null ) {
value = constant.get( null );
}
if ( value != null ) {
System.out.println( value );
} else {
System.out.println( "Constant " + constName + " was not found." );
}
有趣的是,您可以从调用 get()
的 Field 对象访问值,并且您传递 null
因为常量是静态的,因此您没有可从中提取值的实例。
您可以在此处找到完整代码:http://ideone.com/v4fcvH
希望这对您有所帮助。
我有 java class,它具有下面给出的所有常量:
public final class CategoryIDs {
public static final String Extraction_of_natural_gas = "1111";
public static final String Mining_of_hard_coal = "2222";
public static final String Mining_of_iron_ores = "3333";
public static final String Mining_of_lignite = "4444";
}
现在我想通过一个保存变量名称的变量访问其他class中的这些常量。
例如:
String temp = "Extraction_of_natural_gas";
使用这个 temp 变量我想从 class 上面访问常量。但是我不能做 CategoryIDs.temp 因为这是不允许的。那么实现这一目标的最佳方法是什么?
可以使用反射提取:
String value = (String) CategoryIDs.class.getField(temp).get(null);
传递给 get
的 null
参数表示这是一个静态字段,不需要实例来获取它的值。
请注意,此技术很容易出错。上面的代码不包含任何错误检查或异常处理以使其更易于阅读,但真正的应用程序可能应该包含它们。
如果你真的、真的需要用你当前的结构来做这件事,你可以使用反射。
但是,您可能会发现枚举更合适。类似于:
public enum CategoryID {
EXTRACTION_OF_NATURAL_GAS("Extraction_of_natural_gas", 1111),
MINING_OF_HARD_COAL("Mining_of_hard_coal", 2222),
MINING_OF_IRON_ORES("Mining_of_iron_ores", 3333),
MINING_OF_LIGNITE("Mining_of_lignite", 4444);
private static final Map<String, CategoryID> keyMap;
static {
keyMap = new HashMap<>();
for (CategoryID category : CategoryID.values()) {
keyMap.put(category.getKey(), category);
}
}
private final String key;
private final int value;
public int getValue() {
return value;
}
public String getKey() {
return key;
}
private CategoryID(String key, int value) {
this.key = key;
this.value = value;
}
public static CategoryID fromKey(String key) {
return keyMap.get(key);
}
}
这种方法的好处:
- 您将代码中的名称(现在 Java 更常规)与您在数据中提供的键分开。这意味着您可以在数据中使用任何您喜欢的键,包括带有空格的键等。它们不再需要是有效的标识符。
- 当您从代码中引用枚举值时,您仍然可以获得编译时安全性。
- 您将获得 更好 的安全性,因为您永远不会不小心使用字符串而不是类别 ID,您可以使用常量轻松完成。
我认为你正在寻找内省。这是反射的 "read only" 部分,您可以在其中检索对象的值。
代码如下,为了便于理解,拼凑起来:
Object value = null;
String constName = "Bar";
Field constant = Foo.class.getField( constName );
if ( constant != null ) {
value = constant.get( null );
}
if ( value != null ) {
System.out.println( value );
} else {
System.out.println( "Constant " + constName + " was not found." );
}
有趣的是,您可以从调用 get()
的 Field 对象访问值,并且您传递 null
因为常量是静态的,因此您没有可从中提取值的实例。
您可以在此处找到完整代码:http://ideone.com/v4fcvH
希望这对您有所帮助。