Java-获取对象的所有本地字段值作为映射
我想检索java对象中存在的字段值的映射。我尝试了Java-获取对象的所有本地字段值作为映射,java,serialization,reflection,gson,tostring,Java,Serialization,Reflection,Gson,Tostring,我想检索java对象中存在的字段值的映射。我尝试了com.google.Gson和org.apache.commons.lang3.builder.ToStringBuilder来检索关于给定对象的所有详细信息。但出现了以下问题: com.google.Gson: Gson gson = new GsonBuilder.create(); String str = gson.reflectionToString(myObject); 有些对象会出现StackOverflowerError,甚至
com.google.Gson
和org.apache.commons.lang3.builder.ToStringBuilder
来检索关于给定对象的所有详细信息。但出现了以下问题:
Gson gson = new GsonBuilder.create();
String str = gson.reflectionToString(myObject);
有些对象会出现StackOverflowerError,甚至包含JSONObject的映射也会失败String str = ToStringBuilder.reflectionToString(myObject);
在对HashMap使用上述API时,会显示HashMap中的变量,但HashMap的内容不可见
输出:
样品包。CustomHashMap@5fec459b[accessOrder=false,阈值=12,负载因子=0.75]
帮我找到完美的解决方案 您可以尝试使用反射。这允许您使用类名访问类及其元数据。然后可以使用getDeclaredFields方法获取类的所有声明字段。您的字段可以通过这种方式是私有的,因此外部类在不调用getter或setter的情况下无法编辑它们
//initialize the name of your class.
String className = "examplePackageName.exampleClassName";
//get your class using the name of the class
Class<? extends ObjectImplementation> Classtouse = Class.forName(className);
//initialize map of fieldnames to field objects from reflection
Map<String,Field> FieldMap = new HashMap<>();
//gets delcared fields as a List, converts it to an array and for each element in the
//array, it maps the element's name to the element itself as a field object
Arrays.asList(Classtouse.getDeclaredFields()).forEach(Field -> FieldMap.put(Field.getName(),Field));
//now you have your fieldmap ready to use.
其中field是要编辑的字段对象,您可以使用fieldname或其他方法访问它。如果要将字段名直接映射到字段值,可以通过上面的代码进行编辑:
Arrays.asList(Classtouse.getDeclaredFields()).forEach(Field -> FieldMap.put(Field.getName(),Field));
将是:
Arrays.asList(Classtouse.getDeclaredFields()).forEach(Field -> FieldMap.put(Field.getName(),Field.get(//your object here)));
只需确保您已经实例化了一个要首先使用的对象。
在javadoc字段中可以找到此方法和其他反射方法的示例
此处:[链接]
这段代码并不是完全可以运行的,但很接近。您可以循环该类的所有非静态字段。大约4-6行代码。您已经解释了如何在类中获取字段名。但我需要构造对象中这些字段的值。更新我的答案以满足您的需要。希望这有帮助!
Arrays.asList(Classtouse.getDeclaredFields()).forEach(Field -> FieldMap.put(Field.getName(),Field.get(//your object here)));