2014-12-19 41 views
0

假設我有一個對象,我把它字段:確定一個字段是I型創建,使用反射

Field[] fields = obj.getFields(); 

現在我迭代通過每一個與願印他們的成員,如果它是某種類,否則只要使用field.get(obj)以防萬一它是一個字符串,int或任何該命令將打印其值的東西,而不僅僅是引用指針。

我該如何檢測它?

+0

每'的System.out.println(OBJ) 'call會隱式地調用'System.out.println(obj.toString())'。所以int,字符串和覆蓋'toString()'方法的任何其他類都不會打印引用指針。 – BackSlash 2014-12-19 08:44:43

+0

好的,但有沒有辦法告訴它的一個類是否在項目中聲明,而不是內部的java? – buddy123 2014-12-19 08:46:37

+0

@ e-r-a-n您可以檢查軟件包名稱。但是這並不能解決是否知道'toString()'是否被覆蓋的問題。這是你的最終目標嗎?如果是這樣,請參閱[檢測對象是否覆蓋toString()](http://stackoverflow.com/q/22866925)。 – 2014-12-19 08:46:57

回答

0

您可以使用instanceof來區分對象。

public static void main(String[] args) throws FileNotFoundException, UnsupportedEncodingException { 
    Object[] objects = new Object[4]; 
    objects[0] = new Integer(2); 
    objects[1] = "StringTest"; 
    objects[2] = new BigDecimal(2.00d); 
    for (Object obj : objects) { 
     if (obj != null) { 
      if (obj instanceof BigDecimal) { 
       System.out.println("bigdecimal found " + obj); 
      } else if (obj instanceof String) { 
       System.out.println("String found " + obj); 
      } else { 
       System.out.println("Integer found " + obj); 
      } 
     } 
     else{ 
      System.out.println("object is null"); 
     } 
    } 
} 
0

如果你需要測試對象是否在你的項目,你可以看看包名,並將其與你的項目的包名。

您可以在聲明的字段類型或字段內容的運行時類型上執行此操作。下面的代碼片段演示了後一種方法:

SomeClass foo = new SomeClass(); 

for (Field f : foo.getClass().getDeclaredFields()) { 

    boolean wasAccessible = f.isAccessible(); 
    try { 
    f.setAccessible(true); 
    Object object = f.get(foo); 

    if (object != null) { 

     if (object.getClass().getPackage().getName() 
      .startsWith("your.project.package")) { 
     // one of yours 
     } 
    } else { 
     // handle a null value 
    } 
    } finally { 
    f.setAccessible(wasAccessible); 
    } 
} 

一定要記得obj.getFields();只返回公共訪問的領域。正如我上面所做的那樣,您可能需要考慮getDeclaredFields()。如果您堅持使用getFields(),則可以省略上例中的輔助功能代碼。

1

你可以得到,而不需要一類的各領域的Type這樣的實例:

public class GetFieldType { 

    public static void main (String [] args) { 
     Field [] fields = Hello.class.getFields(); 

     for (Field field: fields) { 
      System.out.println(field.getGenericType()); 
     } 
    } 

    public static class Hello { 
     public ByeBye bye; 
     public String message; 
     public Integer b; 
     ... 
    } 
} 
0

有了一些工作,你可以通過加載它們的類加載器區分你的類。在此請看:

Find where java class is loaded from

雖然這可能幫助,它不會成爲你的問題的靈丹妙藥,這主要是因爲:

  • 元(字節,短,焦炭,INT ,long,float,double和boolean)不是類。
  • 類加載器的體系結構在不同的應用程序服務器中是不同的。
  • 同一個類可以被不同的類加載器多次加載。
0

我的理解是你怎麼去在對象層次遞歸,並得到原語的值

public class ParentMostClass { 
    int a = 5; 
    OtherClass other = new OtherClass(); 

    public static void main(String[] args) throws IllegalArgumentException, 
    IllegalAccessException { 
     ParentMostClass ref = new ParentMostClass(); 
     printFiledValues(ref); 
    } 

public static void printFiledValues(Object obj) 
    throws IllegalArgumentException, IllegalAccessException { 

    Class<? extends Object> calzz = obj.getClass(); 
    Field[] fileds = obj.getClass().getDeclaredFields(); 

    for (Field field : fileds) { 
     Object member = field.get(obj); 
     // you need to handle all primitive, they are few 
     if (member instanceof String || member instanceof Number) { 
      System.out.println(calzz + "->" + field.getName() + " : " 
      + member); 
     } else { 
      printFiledValues(member); 
    } 
    } 
} 
} 

public class OtherClass { 
    int b=10; 
} 

我輸出

class com.example.ParentMostClass->a : 5 
class com.example.OtherClass->b : 10 
相關問題