我想检索 java对象中存在的字段值的映射。我尝试了 com.google.Gson
和 org.apache.commons.lang3.builder.ToStringBuilder
来检索有关给定对象的所有详细信息。但是出现了以下问题:
com.google.Gson :
Gson gson = new GsonBuilder.create();
String str = gson.reflectionToString(myObject);
某些对象发生StackOverFlowError,甚至具有JSONObject的映射也会失败。
org.apache.commons.lang3.builder.ToStringBuilder :
String str = ToStringBuilder.reflectionToString(myObject);
使用以上用于HashMap的API时,会显示HashMap内部的变量,但看不到HashMap的内容。
输出:
samplePackage.CustomHashMap@5fec459b [accessOrder = false,threshold = 12,loadFactor = 0.75]
帮我找到完美的解决方案!
答案 0 :(得分:0)
您可以尝试使用反射。这使您可以使用您的类名称来访问您的类及其元数据。然后,您可以使用getDeclaredFields方法获取类的所有声明的Field。您的字段可以通过这种方式私有,这样外部类无需调用getter或setter即可对其进行编辑。
%SystemRoot%\system32\drivers\etc\hosts
要访问字段的值时,可以使用
//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是要编辑的Field对象,使用字段名或其他方法访问了该对象。如果要直接将字段名称映射到字段值,则可以通过上面的代码进行编辑:
//instantiate an object of your Class with type Classtouse here
//use the object created in the line above and set its fields using the line
//below
field.get(//Object that holds this field);
成为:
Arrays.asList(Classtouse.getDeclaredFields()).forEach(Field -> FieldMap.put(Field.getName(),Field));
只需确保已实例化了您要首先执行此操作的对象。 可以在Field javadoc中找到这种和其他反射方法的示例 此处:[链接] https://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Field.html
此代码并非可完美运行,但已接近。