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

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

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

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

 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之外还有其他方法吗?

谢谢

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

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


编辑

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

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

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

 class Constants { public static final int FOO = 123; public static final int BAR = 456; private static Map constantNames = null; public static String getConstantName(int constVal) { if (constantNames == null) { Map cNames = new HashMap() 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" 

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

 import java.util.HashMap; import java.util.Map; public class MapDemo { public static void main(String[] args) { Map myMap = new HashMap(); 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或数据库中轻松使用它,或者您可以以任何方式使用它。 这将为您的项目提供更大的灵活性和稳健性。

您可以使用以下内容:

 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() 。 要记住的另一件事是字段是属性而不是方法变量(因此如果您使用它来访问方法中声明的变量,它将无法工作)。

你可以使用枚举 。

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

 public enum Yourname { FOO, BAR, BEZ } 

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

如果你想得到你在问题中给出的数字,那么如果FOO需要是335343 ,你可以创建编号的枚举。 看看是否有可能分配数字值到enum-in-java和number-for-each-enum-item 。

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

我们如何在java中将行号打印到日志中

我有一个类似的问题,我需要打印每个变量的名称及其值(主要目标是创建一个将在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 

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