Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我可以打印出变量的名称吗?_Java_Reflection - Fatal编程技术网

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

Java 我可以打印出变量的名称吗?,java,reflection,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 (

我已经创建了一个常量变量的数量,超过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"
....
实际上,我想把日志写到这个文件中

实际输出为

This time the output is 335323
我想知道哪个变量来自335323。 除了将这些变量及其关联常量放入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
更改为类似
newmyclass()
的内容。
另一件需要记住的事情是,字段是属性,而不是方法变量(因此,如果您使用它来访问方法中声明的变量,它将不起作用)。

正如我在原始帖子的评论中所指出的,我强烈怀疑,解决当前问题的最佳方法是以完全不同的方式解决它。您似乎希望将int与字符串相关联,其中一种方法是使用诸如HashMap之类的映射。例如

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));
      }
   }
}
import java.util.HashMap;
导入java.util.Map;
公共类MapDemo{
公共静态void main(字符串[]args){
Map myMap=newhashmap();
myMap.put(335343,“FOO”);
myMap.put(234234,“BAR”);
myMap.put(122424,“BEZ”);
int[]测试={33534323421224241010};
for(int i:测试){
//请注意,如果密钥不在映射中,则返回null
System.out.printf(“%d对应于%s%n”,i,myMap.get(i));
}
}
}
编辑1:

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

有一些“特例”可以解决这个问题(其他人告诉过),但最重要的问题是:为什么要这样做(打印变量名)

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


编辑

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

这或多或少是前面答案的组合:

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


我建议您打印行号,而不是变量名。这应该足以让您确定消息来自何处。以下是有关如何做到这一点的更多信息:

您可以使用

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

public enum Yourname {
    FOO, BAR, BEZ
}
并将名称引用为
Yourname.FOO
,将值引用为
Yourname.FOO.ordinal()
。您可以对
if
-块、
switch
-语句使用枚举


如果您想获得您在问题中给出的数字,那么如果
FOO
需要
335343
,您可以创建编号的枚举。看一看和。

我在一长串int变量中遇到了类似的问题,我必须打印每个变量的名称及其值(主要目标是创建一个文本文件,该文件将导入Excel文件)

不幸的是,我对Java编程非常陌生,所以我发现的唯一解决方案(可能是错误的)是使用两个不同的数组:一个字符串数组用于字符串名称,另一个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]);
}
int varName01,varName02。。。。
String[]listNames=新字符串{“varName01”、“varName02”、。。。。。
int[]listValues=新的int{varName01,varName02。。。。。

对于(int i=0;iWhy?你这样做的目的是什么?为什么变量名在运行代码时甚至很重要?或者你真的想用枚举来代替?我强烈怀疑,解决当前问题的最佳方法是以完全不同的方式来解决它。因此,也许你最好告诉我们总体pr是什么您试图解决的问题不是如何解决的问题。@Kit的可能重复:请参阅下面我的答案中的编辑(标记为edit 1)。映射不是更好、更灵活吗?是的(在某些情况下),但在这种情况下,您不需要记得在修改类时修改映射(或者甚至打开类来搜索属性)。无论如何,这主要取决于您将如何使用代码。如果该方法将被大量使用,也许您可以添加(getDeclaredFields()的)所有字段可以使用hash-map,但是我已经声明了很多常量变量,我不想硬编码每一个变量并将其放入hash中map@Kit:你还没有告诉我们你想要完成什么。没有这些信息,我不知道我们怎么能给你建议。@Adrain:更新要告诉贝因的问题
Constants.getConstantName(123);  // return "FOO"
public enum Yourname {
    FOO, BAR, BEZ
}
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]);
}