2015-10-15 47 views
0

我正在使用反射來讀取我創建的一些類對象,並使用遞歸來追蹤整個對象樹。在Java中有什麼方法可以判斷一個類是否是一個簡單的'Java'類?

我遇到的問題是,當我有一個'字段'時,我需要知道它是一個簡單的屬性還是另一個複雜的對象。前者可以立即處理,但後者需要深入研究並再次調用遞歸方法。我的代碼是這樣的:

recurse(Object o) { 
    Class clazz = o.getClass(); 
    for (Field f : clazz.getDeclaredFields()) { 
     fieldClass = f.getType(); 

     // Heres the broken part 
     if (!ClassUtils.isPrimitiveOrWrapper(fieldClass)) { 
      recurse(f.get(o)); 
     } 
     else { 
      // Process simple attribute 
     } 
    } 
} 

我想這會工作,但後來我發現字符串不是「PrimitiveOrWrapper」 ......後來我發現,日期是也不...然後我發現BigDecimal不是...

是否真的沒有類或實用程序包可以處理此請求?我只想知道一個Class是一個內部/本地/簡單/簡單/基本的Java類還是我寫的一個複雜對象。這應該不難。

我相信我的選擇是:

  1. 試驗和錯誤全部列出來單獨 - 希望在未來2年 我不加我以前沒有使用過 一個類型的另一個屬性(Yuck!)
  2. 查看類名是否以字符串java開頭。(雙Yuck!)

請告訴我我錯過了一個很好的工具類/方法的地方。

+3

沒有「簡單」Java類的這種概念。在任何意義上,'String','Date'和'BigDecimal'都不是「簡單的」。 – dimo414

+0

只是一個簡短的問題。如果你處理「簡單」屬性,你需要知道它是什麼類?或者你正在寫一些序列化的東西?然後你可以使用標記界面。否則,如果添加新的類或類似的東西,你可能會遇到每個新的Java版本的問題。 –

+0

所以,你想知道一個類是否是你寫的東西,而不是像java.lang.String或java.util.Date這樣的核心庫的東西呢?他們也認爲「簡單」(例如'org.apache.log4j.Logger')或者他們是「複雜的對象」? 您可以選擇讓您的對象使用註釋標記: '''@Complex public MyClass {int x; }''' – OscarRyz

回答

1

沒有單個API調用會告訴你對象是否爲內部對象。

但是,您可以使用以下方法:

isPrimitive 
isArray 
getPackage 

第一個是相當直截了當。第二個,isArray是需要的,因爲有一個特殊的方法將返回數組的類型。最後getPackage可以用來回答這個問題,這個對象是否是JDK家族的一部分。所有公共Java API包以java.javax.開頭,私有Java API以sun.開頭。

+0

這不是我希望的答案,但我想它是正確的答案。我仍然有些圖書館應該有這樣的東西。 – user3708842

相關問題