这可能没有项目中的主要用例,但我只是尝试了一种POC类型的项目,在这里我得到了密钥代码,并且使用它的值我想在屏幕上打印密钥名称。 我想重新开始编写开关案例,以便考虑通过反思。
有没有办法使用其值来获取接口名称的常量整数?
KeyPressed(int i) {
string pressedKeyName = getPressedKey(i);
System.out.println(pressedKeyName);
}
答案 0 :(得分:21)
我可以想到两个比使用反射更好的解决方案。
任何体面的IDE都会为您自动填写switch语句。我使用IntelliJ并执行此操作(您只需按ctrl-enter)。我确信Eclipse / Netbeans有类似的东西;以及
对于常量而言,枚举比公共静态原语更好。额外的好处是他们可以解决这个问题。
但是要通过反思找出你想要的东西,假设:
interface Foo {
public static final int CONST_1 = 1;
public static final int CONST_2 = 3;
public static final int CONST_3 = 5;
}
执行命令
public static void main(String args[]) {
Class<Foo> c = Foo.class;
for (Field f : c.getDeclaredFields()) {
int mod = f.getModifiers();
if (Modifier.isStatic(mod) && Modifier.isPublic(mod) && Modifier.isFinal(mod)) {
try {
System.out.printf("%s = %d%n", f.getName(), f.get(null));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
输出:
CONST_1 = 1
CONST_2 = 3
CONST_3 = 5
答案 1 :(得分:0)
已将其转换为通用方法,以提高可重用性(例如,对于 switch
和 default
):
/**
* @param cls The *.class which to traverse
* @param value The constant value to look for
*/
@Nullable
private String getConstantName(Class<?> cls, int value) {
for (Field f : cls.getDeclaredFields()) {
int mod = f.getModifiers();
if (Modifier.isStatic(mod) && Modifier.isPublic(mod) && Modifier.isFinal(mod)) {
try {
// Log.d(LOG_TAG, String.format("%s = %d%n", f.getName(), (int) f.get(null)));
if((int) f.get(null) == value) {return f.getName();}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
return null;
}