简体   繁体   中英

Java iterate over class fields to create other class

I have a class like this:

public class Example {
    private String a;
    private Integer b;
    private Boolean c;
    private List<AnotherClass> d;
}

and I want to convert it to something like this:

[
    {
        name: "a",
        value: "a value"
    },
    {
        name: "b",
        value: "1",
    },
    {
        name: "c",
        value: "true",
    }
]

So, I create a class like this:

public class Test {
    private String name;
    private String value;
}

I want to have a method to iterate through the Example class so it will produce the Test class without including d attribute. How to achieve that?

This is something you can do easily with reflection . In the example below, I renamed class Test to Property because it represents a key-value pair. If you are happy with using whatever toString() returns as the value for a field, then the solution is pretty simple:

public class Property {
    private final String name;
    private final String value;

    public Property(String name, String value) {
        this.name = name;
        this.value = value;
    }

    public static List<Property> toProperties(Object object, String... fieldNames)
        throws ReflectiveOperationException
    {
        ArrayList<Property> properties = new ArrayList<>();
        for( String fieldName : fieldNames ) {
            Field field = object.getClass().getDeclaredField(fieldName);
            properties.add(new Property(fieldName, field.get(object).toString()));
        }
        return properties;
    }

    public String toString() {
        return String.format("%s: \"%s\"", name, value);
    }
}

This sample requires you to specify the names of the desired fields explicitly, for example:

List<Property> properties = Property.toProperties(myExample, "a", "b", "c");

If you'd rather have the fields be auto-detected based on some criterion (for example all primitive and String -typed fields, then you could add this logic within toProperties and get rid of the varargs.

you would need to have some appropriate getters in class Example , and a proper constructor in class Test to initialize the object instance variables like

public Test (String name, int value) {
   this.name = name;
   this.value = value'
}

Then for each instance of class Example - lets say you have multiple of those in an array or list - you could iterate over them, retrieve the values you want via the getter methods, and initialize one Test object for each one, eg

List<Test> yourListOfTestInstances = new ArrayList<>();
for (Example exampleObject : yourExampleObjectsListOrArray) {
   yourListOfTestInstances.add(new Test(exampleObject.getA() , exampleObject.getB()));
}

Then for each created Test instance inside your ArrayList, you could easily build your JSON as needed (even though I do not fully understand why you even need at all this intermediate Test class to do that)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM