diff --git a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java index 014bea261..647867a45 100644 --- a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java +++ b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java @@ -99,4 +99,14 @@ public class GlobalOptions { ) public static volatile String jobTimeout = "1d"; + /** + * 是否打印parent类里的field + * @see com.taobao.arthas.core.view.ObjectView + */ + @Option(level = 1, + name = "print-parent-fields", + summary = "Option to print all fileds in parent class", + description = "This option enables print files in parent class, default value true." + ) + public static volatile boolean printParentFields = true; } diff --git a/core/src/main/java/com/taobao/arthas/core/view/ObjectView.java b/core/src/main/java/com/taobao/arthas/core/view/ObjectView.java index 30e0bd402..5b8e1caba 100644 --- a/core/src/main/java/com/taobao/arthas/core/view/ObjectView.java +++ b/core/src/main/java/com/taobao/arthas/core/view/ObjectView.java @@ -582,7 +582,22 @@ public class ObjectView implements View { appendStringBuilder(buf, format("@%s[%s]", className, obj)); } else { appendStringBuilder(buf, format("@%s[", className)); - final Field[] fields = obj.getClass().getDeclaredFields(); + List fields = new ArrayList(); + Class objClass = obj.getClass(); + if (GlobalOptions.printParentFields) { + // 当父类为null的时候说明到达了最上层的父类(Object类). + while (objClass != null) { + for (Field field : objClass.getDeclaredFields()) { + fields.add(field); + } + objClass = objClass.getSuperclass(); + } + } else { + for (Field field : objClass.getDeclaredFields()) { + fields.add(field); + } + } + if (null != fields) { for (Field field : fields) { @@ -620,17 +635,6 @@ public class ObjectView implements View { } } - /** - * 是否根节点 - * - * @param deep 深度 - * @return true:根节点 / false:非根节点 - */ - private static boolean isRoot(int deep) { - return deep == 0; - } - - /** * 是否展开当前深度的节点 * diff --git a/core/src/test/java/com/taobao/arthas/core/view/ObjectViewTest.java b/core/src/test/java/com/taobao/arthas/core/view/ObjectViewTest.java index 5c38f35cd..04f8f5ea6 100644 --- a/core/src/test/java/com/taobao/arthas/core/view/ObjectViewTest.java +++ b/core/src/test/java/com/taobao/arthas/core/view/ObjectViewTest.java @@ -266,4 +266,41 @@ public class ObjectViewTest { return new NestedClass(code); } } + + /** + * 显示基类属性值 + */ + @Test + public void testObjectViewBaseFieldValue() { + SonBean sonBean = new SonBean(); + sonBean.setI(10); + sonBean.setJ("test"); + + ObjectView objectView = new ObjectView(sonBean, 3, 100); + Assert.assertTrue(objectView.draw().contains("i=@Integer[10]")); + } + + private class BaseBean { + private int i; + + public int getI() { + return i; + } + + public void setI(int i) { + this.i = i; + } + } + + private class SonBean extends BaseBean { + private String j; + + public String getJ() { + return j; + } + + public void setJ(String j) { + this.j = j; + } + } }