Java-获取对象的所有本地字段值作为映射

时间:2018-07-27 11:37:45

标签: java serialization reflection gson tostring

我想检索 java对象中存在的字段值的映射。我尝试了 com.google.Gson org.apache.commons.lang3.builder.ToStringBuilder 来检索有关给定对象的所有详细信息。但是出现了以下问题:

  1. com.google.Gson

    Gson gson = new GsonBuilder.create();
    String str = gson.reflectionToString(myObject);
    

    某些对象发生StackOverFlowError,甚至具有JSONObject的映射也会失败。

  2. 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]

帮我找到完美的解决方案!

1 个答案:

答案 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

此代码并非可完美运行,但已接近。