Java 如何从具有多个相同字段值的类的值中获取字段名

Java 如何从具有多个相同字段值的类的值中获取字段名,java,Java,我试图使用反射从值打印字段名称。但是,当没有重复字段时,它会工作。但是在下面的例子中,假设我有重复值的字段,我将它们放在HashMap中。在这种情况下,我得到了不正确的字段名 我选择了HashMap来存储字段名,但是有人能告诉我是否有其他方法来实现我的目标吗 public class TestBug { private static String banana = "green"; private static String apple = "red"; private static Stri

我试图使用
反射
从值打印字段名称。但是,当没有重复字段时,它会工作。但是在下面的例子中,假设我有重复值的字段,我将它们放在
HashMap
中。在这种情况下,我得到了不正确的字段名

我选择了
HashMap
来存储字段名,但是有人能告诉我是否有其他方法来实现我的目标吗

public class TestBug {

private static String banana = "green";
private static String apple = "red";
private static String blueberry = "blue";
private static String mango = "green";


private Map<String, String> fillFruitMap() {
    Map<String, String> fruitMap = new HashMap<String, String>();
    String fruitColor = "";
    String fruitName = "";
    Field[] fields = TestBug.class.getDeclaredFields();
    for (int i = 0; i < fields.length; i++) {
        try{
            fruitColor = fields[i].get(this).toString();    
            fruitName = fields[i].getName();
            fruitMap.put(fruitColor, fruitName);
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
    return fruitMap;
}

private String getFruitNameFromColor(String color) {
    return fillFruitMap().get(color);
}

private void printStatement(String fruit) {
    System.out.println("Green is the color of "+getFruitNameFromColor(fruit));
}

public static void main(String[] args) {
    TestBug bug = new TestBug();
    bug.printStatement(banana);
}
公共类测试错误{
私有静态字符串banana=“绿色”;
私有静态字符串apple=“red”;
私有静态字符串blueberry=“blue”;
私有静态字符串mango=“green”;
私有映射fillfuturemap(){
Map foultmap=newhashmap();
字符串furtocolor=“”;
字符串名称=”;
Field[]fields=TestBug.class.getDeclaredFields();
for(int i=0;i
}

在上面的代码中,由于我将
banana
传递给
printStatement
方法,因此在使用
Reflection
并将字段值和名称存储为
key
value
对时,它还应该将
banana
打印回
HashMap
。 但是由于
HashMap
不允许重复
香蕉
芒果
覆盖。有没有办法实现我的目标


有没有办法使用
hashCode()

一个选项是使用
Map
而不是
Map

private Map fillFruitMap(){
Map foultmap=newhashmap();
字符串furtocolor=“”;
字符串名称=”;
Field[]fields=TestBug.class.getDeclaredFields();
for(int i=0;i
您的代码的问题在于您选择了错误的表示法:由于字段的值不是一对一(正如您所注意到的),而是一对多,您的代码应该返回
Map
,而不是
Map

private Map fillFruitMap(){
Map foultmap=newhashmap();
字符串furtocolor=“”;
字符串名称=”;
Field[]fields=TestBug.class.getDeclaredFields();
for(int i=0;i

这将允许您使用所需的值存储所有字段的名称。当然,使用此更新的
fillfurtmap
的代码也应该更改。具体来说,在迭代地图时,它需要准备打印列表,而不是单个字符串。

为什么即使我有一个
banana
方法,也不能将水果名称作为键呢?当我反复浏览
列表时,最后我如何知道我应该打印香蕉而不是芒果?@user1629109“因为我传递了“香蕉”,它应该选择“香蕉”…“不,你没有传递
“香蕉”
,你传递了名为
香蕉的变量的值,但值是
“绿色”
。你的程序无法找到你传递的变量的名称。是的。这就是我面临的问题。你知道有没有办法存储
hashCode
并比较hashCode,从而得到我想要做的事情吗?@user1629109 Hash code根本不起作用。仅用一个值来消除字段的歧义是不可能的。非常感谢您的回答。即使我有一个香蕉,如果我通过了香蕉方法,我怎么能得到香蕉?当我反复浏览列表,最后我怎么知道我应该打印香蕉而不是芒果?这是一个需要你回答的问题。既然香蕉和芒果的颜色都一样,你怎么知道你想要哪种水果呢?因为我通过了“香蕉”,它应该从
列表中选择“香蕉”
private Map<String, List<String>> fillFruitMap() {
    Map<String, List<String>> fruitMap = new HashMap<String, List<String>>();
    String fruitColor = "";
    String fruitName = "";
    Field[] fields = TestBug.class.getDeclaredFields();
    for (int i = 0; i < fields.length; i++) {
        try{
            fruitColor = fields[i].get(this).toString();    
            fruitName = fields[i].getName();
            List<String> list = fruitMap.get(fruitColor);
            if(list == null) list = new ArrayList<String>();
            list.add(fruitName);
            fruitMap.put(fruitColor, list);
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
    return fruitMap;
}
private Map<String,List<String>> fillFruitMap() {
    Map<String, String> fruitMap = new HashMap<String,List<String>>();
    String fruitColor = "";
    String fruitName = "";
    Field[] fields = TestBug.class.getDeclaredFields();
    for (int i = 0; i < fields.length; i++) {
        try{
            fruitColor = fields[i].get(this).toString();    
            fruitName = fields[i].getName();
            List<String> list = fruitMap.get(fruitColor);
            if (list == null) {
                list = new ArrayList<String>();
                fruitMap.put(fruitColor, list);
            }
            list.add(fruitName);
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
    return fruitMap;
}