Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.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
“通用”;准toString();使用Java类反射_Java_Reflection - Fatal编程技术网

“通用”;准toString();使用Java类反射

“通用”;准toString();使用Java类反射,java,reflection,Java,Reflection,我一直在尝试创建一个健壮的代码,打印出任何Java类进行调试。为此,我使用反射。 为了防止递归定义,例如“Boolean包含静态最终Boolean TRUE”,我忽略等于其父字段的字段。 我使用String+=只是出于懒惰。它不一定要有效率 然而,有没有更好的方法对反射对象进行递归描述 public String reflectionShowFields(Object parentObject) { String stringData = ""; for (Field fiel

我一直在尝试创建一个健壮的代码,打印出任何Java类进行调试。为此,我使用反射。 为了防止递归定义,例如“Boolean包含静态最终Boolean TRUE”,我忽略等于其父字段的字段。 我使用String+=只是出于懒惰。它不一定要有效率

然而,有没有更好的方法对反射对象进行递归描述

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和内存。因为整个过程都是为了调试,所以当最终产品不需要时,我最好不要浪费宝贵的内存。谢谢