我可以打印出变量的名称吗?

时间:2011-07-27 01:22:05

标签: java reflection

我创造了一个号码。常数变量超过1000,这些常数是唯一的整数。

public static final FOO  335343
public static final BAR  234234
public static final BEZ  122424
....
....
....

有没有办法打印出FOO,BAR和BEZ,这是Java中名字的变量? 我不熟悉java反射。我不知道这是否有帮助。

if ( FOO == 335343)
   ---> output "FOO"
if ( BAR == 234234 )
   ---> ouptut "BAR"
....

实际上问这个问题是我想把日志写入文件

System.out.println("This time the output is " + FOO);

,实际输出为

This time the output is 335323

我想知道哪个变量来自335323。 除了将这些变量及其关联常量放入hashMap之外还有其他方法吗?

由于

6 个答案:

答案 0 :(得分:4)

有一些'特殊情况'你可以解决这个问题(由其他人讲述),但最重要的问题是:你为什么要这样做(打印出变量名)?

根据我的经验,99.9%的类似问题(如何打印变量名称?如何获取变量取决于用户输入变量名称等等)实际上是由编程初学者提出的,他们只是做出了不正确的假设和设计。他们正在努力实现的目标可以通过更合适的设计来实现。


修改

老实说,我仍然不认为你要做的是要走的路,但至少我认为以下是可行的答案:

它或多或少是以前答案的组合:

(没有尝试编译,但至少它给你一个想法)

class Constants {
  public static final int FOO = 123;
  public static final int BAR = 456;

  private static Map<Integer, String> constantNames = null;


  public static String getConstantName(int constVal) {
    if (constantNames == null) {
      Map<Integer, String> cNames = new HashMap<Integer, String>()
      for (Field field : MyClass.class.getDeclaredFields()){
        if ((field.getModifiers() & (Modifier.FINAL | Modifier.STATIC)) != 0) {
            && int.class == field.getType()){
          // only record final static int fields
          cNames.put((Integer)field.get(null), field.getName());
        }
      }
      constNames = cNames;
    }
    return constantNames.get(constVal);
  }
}

假设您想获得一个常量名称,只需执行:

Constants.getConstantName(123);  // return "FOO"

答案 1 :(得分:3)

正如我在对原帖的评论中所提到的,我强烈怀疑当前问题的最佳解决方案是以完全不同的方式解决它。您似乎想要将int与String相关联,并且一种方法是使用诸如HashMap之类的Map。例如,

import java.util.HashMap;
import java.util.Map;

public class MapDemo {
   public static void main(String[] args) {
      Map<Integer, String> myMap = new HashMap<Integer, String>();
      myMap.put(335343, "FOO");
      myMap.put(234234, "BAR");
      myMap.put(122424, "BEZ");

      int[] tests = {335343, 234234, 122424, 101010};

      for (int i : tests) {
         // note that null is returned if the key isn't in the map
         System.out.printf("%d corresponds to %s%n", i, myMap.get(i));
      }
   }
}

编辑1:
根据您最近的评论并更新原始问题,我认为您有许多数字及其相关的字符串参与此程序,您需要找到与该数字相关联的字符串。如果是这样,那么你需要考虑重新设计,数字和它们的字符串不应该硬编码到程序中,而应该是程序数据的一部分,也许是在一列中是数字和下一个数据的文本文件中列(可能由空格分隔),相关文本。通过这种方式,您可以读取数据并在HashMap或数据库中轻松使用它,或者您可以以任何方式使用它。这将为您的项目提供更大的灵活性和稳健性。

答案 2 :(得分:2)

您可以使用以下内容:

for (Field field : MyClass.class.getDeclaredFields()){
    if (field.getType().toString().equals("int")){
        int val = (Integer)field.get(MyClass.this);
        switch (val){
            case 335343:
            case 234234:
                System.out.println(field.getName());
        }
    }
}

请记住更改MyClass作为您的班级名称,并且至少应存在一个实例以获取该字段的值。因此,如果您计划使用main方法测试代码,则应将MyClass.this更改为new Myclass()之类的内容。 另外要记住的是,字段是属性而不是方法变量(因此,如果您使用它来访问方法中声明的变量,它将无法工作)。

答案 3 :(得分:1)

您可以使用enum

如果这些数字只需要是唯一的,你可以说

public enum Yourname {
    FOO, BAR, BEZ
}

并将名称称为Yourname.FOO,将值称为Yourname.FOO.ordinal()。您可以使用枚举if - 块,switch - 语句。

如果您想获得问题中提供的数字,那么如果FOO需要335343,您可以创建编号的枚举。请查看is-it-possible-to-assign-numeric-value-to-an-enum-in-javanumber-for-each-enum-item

答案 4 :(得分:0)

我建议你打印出行号,而不是变量名。这应该足以确定消息的来源。以下是有关如何执行此操作的更多信息:

How can we print line numbers to the log in java

答案 5 :(得分:0)

我有一个类似的问题,我需要打印每个变量的名称及其值(主要目标是创建一个将在Excel文件中导入的文本文件)。

不幸的是,我在Java编程方面很新,所以我找到的唯一解决方案(可能是错误的)是使用两个不同的数组:一个String数组用于String名称,另一个Int数组用于相应的值。

例如:

int varName01, varName02, ....
String[] listNames = new String {"varName01", "varName02", .....
int[] listValues = new int {varName01, varName02, .....
for (int i=0; i<listValues.length;i++)
{
 print String.format("%s %d", listNames[i], listValues[i]);
}

这可能不是正确的方法,所以任何Java专家的意见都会受到欢迎。谢谢!