我正在创建一些POJO,并且必须为每个POJO创建toString()
个方法。我认为使用反射API创建一个为我工作的类更容易 - 在一个地方创建功能并在每个POJO中使用它,而不是手动编码。
POJO中的所有字段都是私有的。 POJO是JSON对象的Java对象表示。
要求是遍历类中的字段,并列出字段和值。
我目前正在测试名为ChannelResource.
这是我用来列出字段名称和值的类:
import java.lang.reflect.Field;
public class ToStringMaker {
public ToStringMaker( Object o) {
Class<? extends Object> c = o.getClass();
Field[] fields = c.getDeclaredFields();
for (Field field : fields) {
String name = field.getName();
try {
System.out.format("%n%s: %s", name, field.get(o));
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}}
我正在将ChannelResource
类的实例传递给构造函数。
编译器不喜欢此行中的field.get(o)
:
System.out.format("%n%s: %s", name, field.get(o));
编译器说:
java.lang.IllegalAccessException: Class ToStringMaker can not access a member of class ChannelResource with modifiers "private"
ToStringMaker
如果我让所有成员公开,那就有效,但我真的不愿意这样做。有没有其他方法可以获得私有领域的价值?
我知道Apache组织有一些创建toString功能的东西,但我不喜欢这种格式。
答案 0 :(得分:2)
试试这个
import java.lang.reflect.Field;
public class ToStringMaker {
public ToStringMaker( Object o) {
Class<? extends Object> c = o.getClass();
Field[] fields = c.getDeclaredFields();
for (Field field : fields) {
String name = field.getName();
field.setAccessible(true);
try {
System.out.format("%n%s: %s", name, field.get(o));
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}}