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;
}