反思地看一个变量名,而不是值

时间:2015-10-23 16:30:27

标签: java reflection

鉴于课程:

class Statics {
  public static String LOC_MY_SELECTOR;

  static void find(String selector) {
    System.out.println(selector);
  }  

  public static void main(String...args) {
    find(LOC_MY_SELECTOR);
  }
}

System.out.println得到字段名称而不是值时,我怎么能够?值为null,因此它当然会打印出null。我想做的是:

find(LOC_MY_SELECTOR); // to print "LOC_MY_SELECTOR" instead of the value `null`

这甚至可能吗?

1 个答案:

答案 0 :(得分:-1)

答案是“是的,你可以。”

我通过填充类构造函数中的静态字段来解决这个问题。然后每个后续参考,该字段将被设置。

class Statics {
  public static String LOC_MY_SELECTOR;

  public Statics() {
    Field[] fields = getClass().getDeclaredFields();

    for (Field field : fields) {
      int mods = field.getModifiers();
      if (field.getType() == String.class &&
        !Modifier.isFinal(mods) &&
        Modifier.isStatic(mods) &&
        Modifier.isPublic(mods) &&
        field.getName().startsWith("LOC_")
      ) {

        String fieldName = field.getName();
        field.setAccessible(true);

        try {
          // homepage_
          String translation = fieldName.split("_", 2)[1].toLowerCase();

          field.set(field, translation);
        } catch (IllegalAccessException e) {
          e.printStackTrace();
        }
      }
    }
  }

  static void find(String selector) {
    System.out.println(selector);
  }  

  public static void main(String...args) {
    find(LOC_MY_SELECTOR);
    // will print "my_selector" now
  }
}