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

发布于 2024-08-28 02:48:03 字数 275 浏览 7 评论 0原文

这在项目中可能没有主要用例,但我只是尝试一个 POC 类型的项目,在其中我获取密钥代码,并使用它的值我想在屏幕上打印密钥名称。 我想从写 switch case 中解脱出来,所以考虑通过反思来解决。

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

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

This might not have a major usecase in projects, but I was just trying a POC kind of project where in I get the key code, and using its value I want to print the key name on screen.
I want to relive myself off writing switch cases, so thinking of going by reflection.

Is there a way to get the constant integer of interface's name using its value?

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

望喜 2024-09-04 02:48:03

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

  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

I can think of two better solutions to this than using reflection.

  1. Any decent IDE will auto-fill in switch statements for you. I use IntelliJ and it does this (you just press ctrl-enter). I'm sure Eclipse/Netbeans have something similar; and

  2. Enums make a far better choice for constants than public static primitives. The added advantage is they will relieve you of this problem.

But to find out what you want via reflection, assuming:

interface Foo {
  public static final int CONST_1 = 1;
  public static final int CONST_2 = 3;
  public static final int CONST_3 = 5;
}

Run:

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();
      }
    }
  }
}

Output:

CONST_1 = 1
CONST_2 = 3
CONST_3 = 5
两相知 2024-09-04 02:48:03

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

Have converted this to a generic method, for improved reusability (eg. for 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;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文