Let's say I have a class like this (and also further assume that all the private variables:
public class Item {
private String _id = null;
private String _name = null;
private String _description = null;
...
}
Now, if I want to build a toString() representation of this class, I would do something like this inside the Item class:
@Override
public String toString() {
return (_id + " " + _name + " " + _description);
}
But what if I have say 15 private variables inside the class? Do I have to write the name of each and every variable like this?
Ideally, I would like to get over with the task by iterating through the list of private variables of this class and construct the string representation:
@Override
public String toString() {
ArrayList<String> members = getClass().getMembers(); //Some method like this
String string = "";
for(...)
string += members[i] + " ";
}
Or perhaps a toJSON method, I would still need access to the names of these variables. Any suggestions?
This should be exactly what you are looking for
You may run into the problem of speed. If you are using reflection, it can be really slow, in comparison to running native code. If you are going to use reflection, then you should probably have an in memory cache of the variables you are goaing to iterate over.
Starting from the good medopal answer, you can use this code to have a string representation of all fields of an object, even if you are outside its class (obviously it's only for fields with a getter method):
You could do:
Don't use string concatenation to construct an end result from 15 data members, particularly if the
toString()
will be called a lot. The memory fragmentation and overhead could be really high. UseStringBuilder
for constructing large dynamic strings.I usually get my IDE (IntelliJ) to simply generate
toString()
methods for me rather than using reflection for this.Another interesting approach is to use the @ToString annotation from Project Lombok:
I find this much more preferable to, say, Jakarta Commons toString builders because this approach is far more configurable and it's also built at compile-time not run-time.
There is such an api, and it is called Java Reflection
To accomplish what you are requesting, you can simply do something like:
Most IDEs provide a way to create a
toString
method in a given class.Given an
Item
class with multiple fields:For example, in Eclipse, performing "Generate toString()" feature on the
Item
class above will create the following:Using reflection would allow a programmatic way to observe one's own fields, but reflection itself is a fairly expensive (read: slow) process, so unless it is truly required, using a fixed
toString
method written at runtime is probably going to be more desirable.