我创造了一个号码。常数变量超过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之外还有其他方法吗?
由于
答案 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-java和number-for-each-enum-item。
答案 4 :(得分:0)
我建议你打印出行号,而不是变量名。这应该足以确定消息的来源。以下是有关如何执行此操作的更多信息:
答案 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专家的意见都会受到欢迎。谢谢!