簡體   English   中英

庫可以打印嵌套Java對象的所有公共字段嗎?

[英]Library to print all public fields of nested Java objects?

我需要打印嵌套Java對象的所有公共字段。 這些對象僅包含數據,沒有方法。 在對象樹的任何級別(葉節點除外)上,字段都可以是Maps,Lists,Sets和arrays。 葉節點是原始類型。 嵌套字段應打印為以下格式的字符串:

<fieldName1>.<fieldName2>. ... <fieldNameN>==<value>

哪里:

<fieldName1> -- root (top level) field name
<fieldNameN> -- N-level field name
<value> -- N-level field value.

有沒有圖書館來解決這個任務?

以下示例遠遠不夠完整-它起草了一個解決方案並顯示了一些陷阱:

public class Main {
    private static Set<Object> visited = new HashSet<Object>();
    public String s = "abc";
    public int i = 10;
    public Main INSTANCE = this;

public static void main (String[] args) throws Exception
{
   printFields(new Main(), "");
}

    private static void printFields(Object obj, String pre) throws Exception{
      Field[] fields = obj.getClass().getFields();
      for (Field field:fields) {
         String value = "";
         String type = field.getType().toString();

         // handle primitve values
         if (type.equals("int")) {
           value += field.getInt(obj);
         } 

         // handle special types, you may add Wrapper classes
          else if (type.equals("class java.lang.String")) {
           value = field.get(obj).toString();  
         } 

         // handle all object that you want to inspect
          else {
           if (visited.contains(field.get(obj))) {
             // necessary to prevent stack overflow
             value = "CYCLE DETECTED";
           } else {
             // recursing deeper
             visited.add(field.get(obj));
             pre += field.getName() + ".";
             printFields(field.get(obj), pre);
           }
         }     

         System.out.printf("%s%s = %s%n", pre, field.getName(), value);
      }
    }
}
  • 我們在反射API中找到了所需的一切
  • 我們需要遞歸才能遍歷對象樹
  • 我們需要對原語進行一些特殊處理
  • 我們需要對不可變類型進行一些特殊處理(例如,我們不想遞歸到String對象中
  • 如果我們兩次訪問對象,則需要小心。

注意-代碼非常丑陋,希望可以給您一個想法

無需圖書館。 這在Java中稱為反射。 使用以下方法可以查看類文檔

for(Field field : YourClass.class.getFields()){
    //Print field info
}

編輯:您可以通過執行getDeclaringClass()獲得Field的類。 可以通過執行isPrimitive()來檢查此類是否為原始isPrimitive() 如果是,則可以打印該值。 如果沒有,您可以遞歸並打印該字段的字段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM