使用其值获取接口常量名称

时间:2010-04-08 12:10:22

标签: java reflection constants

这可能没有项目中的主要用例,但我只是尝试了一种POC类型的项目,在这里我得到了密钥代码,并且使用它的值我想在屏幕上打印密钥名称。 我想重新开始编写开关案例,以便考虑通过反思。

有没有办法使用其值来获取接口名称的常量整数?

KeyPressed(int i) {
    string pressedKeyName = getPressedKey(i);
    System.out.println(pressedKeyName);
}

2 个答案:

答案 0 :(得分:21)

我可以想到两个比使用反射更好的解决方案。

  1. 任何体面的IDE都会为您自动填写switch语句。我使用IntelliJ并执行此操作(您只需按ctrl-enter)。我确信Eclipse / Netbeans有类似的东西;以及

  2. 对于常量而言,枚举比公共静态原语更好。额外的好处是他们可以解决这个问题。

  3. 但是要通过反思找出你想要的东西,假设:

    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)

已将其转换为通用方法,以提高可重用性(例如,对于 switchdefault):

/**
 * @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;
}