Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-获取对象的所有本地字段值作为映射_Java_Serialization_Reflection_Gson_Tostring - Fatal编程技术网

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,甚至

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

  • com.google.Gson

    Gson gson = new GsonBuilder.create();
    String str = gson.reflectionToString(myObject);
    
    有些对象会出现StackOverflowerError,甚至包含JSONObject的映射也会失败

  • org.apache.commons.lang3.builder.ToStringBuilder

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