“通用”;准toString();使用Java类反射
我一直在尝试创建一个健壮的代码,打印出任何Java类进行调试。为此,我使用反射。 为了防止递归定义,例如“Boolean包含静态最终Boolean TRUE”,我忽略等于其父字段的字段。 我使用String+=只是出于懒惰。它不一定要有效率 然而,有没有更好的方法对反射对象进行递归描述“通用”;准toString();使用Java类反射,java,reflection,Java,Reflection,我一直在尝试创建一个健壮的代码,打印出任何Java类进行调试。为此,我使用反射。 为了防止递归定义,例如“Boolean包含静态最终Boolean TRUE”,我忽略等于其父字段的字段。 我使用String+=只是出于懒惰。它不一定要有效率 然而,有没有更好的方法对反射对象进行递归描述 public String reflectionShowFields(Object parentObject) { String stringData = ""; for (Field fiel
public String reflectionShowFields(Object parentObject) {
String stringData = "";
for (Field field:parentObject.getClass().getFields()) {
try {
Class<?> type = field.getType();
String typeSimpleName = type.getSimpleName();
Object fieldValue = field.get(parentObject);
String fieldName = field.getName();
if (type.isPrimitive() || type.isEnum() || CharSequence.class.isAssignableFrom(type)) {
stringData += String.format("%s: %s\n", fieldName, fieldValue);
} else if (Iterable.class.isAssignableFrom(type)) {
stringData += String.format(">>> %s[%s]: \n", fieldName, typeSimpleName);
for (Object item:(Iterable)fieldValue) {
stringData += reflectionShowFields(item);
}
stringData += String.format("<<< %s[%s]: \n", fieldName, typeSimpleName);
} else if (!fieldValue.equals(parentObject)) {
stringData += String.format(">>> %s[%s]: %s \n--------\n", fieldName, typeSimpleName, fieldValue.toString());
stringData+= reflectionShowFields(fieldValue);
stringData += String.format("<<< %s[%s]: \n", fieldName, typeSimpleName);
}
} catch (IllegalAccessException ignored) {}
}
return stringData;
}
公共字符串反射显示字段(对象父对象){
字符串stringData=“”;
用于(字段:parentObject.getClass().getFields()){
试一试{
类类型=field.getType();
字符串typeSimpleName=type.getSimpleName();
Object fieldValue=field.get(parentObject);
字符串fieldName=field.getName();
if(type.isPrimitive()| | type.isEnum()| | CharSequence.class.isAssignableFrom(type)){
stringData+=String.format(“%s:%s\n”,字段名,字段值);
}else if(Iterable.class.isAssignableFrom(type)){
stringData+=String.format(“>>>%s[%s]:\n”,字段名,类型SimpleName);
for(对象项:(Iterable)字段值){
stringData+=反射显示字段(项);
}
stringData+=String.format(“>%s[%s]:%s\n------\n”,字段名,类型SimpleName,字段值.toString());
stringData+=reflectionShowFields(fieldValue);
stringData+=String.format(“您可以使用Apache commons lang ReflectionStringBuilder您可以使用Apache commons lang ReflectionStringBuilder我认为这行不通
- 忽略“与其父项相等”的字段将不起作用。如果您有一个
A
引用了B
并返回到A
,该怎么办
- 您需要了解循环以及DAG中的共享节点
- 迭代一个
Iterable
可能有副作用,或者它可能永远不会终止,或者它可能抛出异常
- 生成任意图形的可读呈现可能非常困难
- 这将比手工构建的
toString()
方法慢一个数量级
但这样想吧。如果这是一个好主意,那么会有高知名度的第三方库来做这种事情。我们都已经在使用它们了。事实证明,有第三方库,但你很难称它们为高知名度
顺便说一句,您可以使用JAXB或JSON绑定将POJO呈现为文本
最后,您使用布尔类型静态字段的布尔示例并不恰当。您不希望在显示实例时呈现静态字段。我认为这行不通
- 忽略“与其父项相等”的字段将不起作用。如果您有一个
A
引用了B
并返回到A
,该怎么办
- 您需要了解循环以及DAG中的共享节点
- 迭代一个
Iterable
可能有副作用,或者它可能永远不会终止,或者它可能抛出异常
- 生成任意图形的可读呈现可能非常困难
- 这将比手工构建的
toString()
方法慢一个数量级
但这样想吧。如果这是一个好主意,那么会有高知名度的第三方库来做这种事情。我们都已经在使用它们了。事实证明,有第三方库,但你很难称它们为高知名度
顺便说一句,您可以使用JAXB或JSON绑定将POJO呈现为文本
最后,您使用布尔类型静态字段的布尔示例并不恰当。您不希望在显示实例时呈现静态字段。eclipse不能为您生成toString()吗?这似乎比它的价值更麻烦。请参阅eclipse不能生成toString()吗对你来说?这似乎比它的价值更麻烦。请参阅,我也同意,必须修复它以使其工作。必须放弃递归类型。如果你有一个没有定义toString()的递归类型-运气不好。很遗憾,但我不想在调试工具上花费太多时间。至于第三方等,我不喜欢。我是一个lib,所以我最好不要把用户和其他lib搞混。另外,它是Android。我需要内存不足。所以对我来说,它只是POJO。同意,必须修复它,使其工作。必须放弃递归类型。如果你有递归类型pe没有定义toString()-真倒霉。很遗憾,但我不想在调试工具上花费太多时间。至于第三方等,我不喜欢。我是一个lib,所以最好不要让用户与其他lib混淆。另外,它是Android。我需要内存不足。所以对我来说,这只是POJO。如果我可以轻松加入libs,它可能会起作用:(我运行的是Android,所以我必须精简libs和内存。因为整个过程都是为了调试,所以当最终产品不需要时,我最好不要浪费宝贵的内存。谢谢。如果我可以轻松加入libs,S.M本可以工作的:(我在运行Android,所以我必须精简libs和内存。因为整个过程都是为了调试,所以当最终产品不需要时,我最好不要浪费宝贵的内存。谢谢