我可以打印出变量的名称吗?
我创造了一个号码。 常量变量超过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专家的意见都会受到欢迎。 谢谢!