【问题标题】:Get interface constant name using its value使用其值获取接口常量名称
【发布时间】:2010-04-08 12:10:22
【问题描述】:

这在项目中可能没有主要用例,但我只是在尝试一种 POC 类型的项目,在其中我获取密钥代码,并使用它的值我想在屏幕上打印密钥名称。 我想通过编写 switch 案例来重温一下自己,所以想通过反思来实现。

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

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

【问题讨论】:

  • 你确定你在谈论接口吗?因为如果您指的是枚举,您的问题可能是有意义的。但是接口没有“常量整数”之类的东西。
  • 嗯,它确实是接口。而且我不知道我们对放置在带值的接口中的整数还有什么要求。
  • ...但是您究竟希望对常量整数做什么?你能提供这样的伪代码吗?
  • 更新了你问的问题

标签: java reflection constants


【解决方案1】:

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

  1. 任何体面的 IDE 都会为您自动填写 switch 语句。我使用 IntelliJ,它可以做到这一点(你只需按 ctrl-enter)。我确信 Eclipse/Netbeans 有类似的东西;和

  2. 对于常量来说,枚举比公共静态原语要好得多。额外的好处是它们可以帮你解决这个问题。

但是要通过反射找出你想要什么,假设:

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

【讨论】:

  • 那不是我的选择。感谢 cletus 的努力。但真的很想通过反思
  • 这就是我在说的哥们:)
【解决方案2】:

已将此转换为通用方法,以提高可重用性(例如,用于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;
}

【讨论】:

    猜你喜欢
    • 2016-02-02
    • 2022-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 2010-12-25
    • 2020-07-19
    相关资源
    最近更新 更多