假設我有一個對象,我把它字段:確定一個字段是I型創建,使用反射
Field[] fields = obj.getFields();
現在我迭代通過每一個與願印他們的成員,如果它是某種類,否則只要使用field.get(obj)
以防萬一它是一個字符串,int或任何該命令將打印其值的東西,而不僅僅是引用指針。
我該如何檢測它?
假設我有一個對象,我把它字段:確定一個字段是I型創建,使用反射
Field[] fields = obj.getFields();
現在我迭代通過每一個與願印他們的成員,如果它是某種類,否則只要使用field.get(obj)
以防萬一它是一個字符串,int或任何該命令將打印其值的東西,而不僅僅是引用指針。
我該如何檢測它?
您可以使用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");
}
}
}
如果你需要測試對象是否在你的項目,你可以看看包名,並將其與你的項目的包名。
您可以在聲明的字段類型或字段內容的運行時類型上執行此操作。下面的代碼片段演示了後一種方法:
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()
,則可以省略上例中的輔助功能代碼。
你可以得到,而不需要一類的各領域的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;
...
}
}
有了一些工作,你可以通過加載它們的類加載器區分你的類。在此請看:
Find where java class is loaded from
雖然這可能幫助,它不會成爲你的問題的靈丹妙藥,這主要是因爲:
我的理解是你怎麼去在對象層次遞歸,並得到原語的值
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
每'的System.out.println(OBJ) 'call會隱式地調用'System.out.println(obj.toString())'。所以int,字符串和覆蓋'toString()'方法的任何其他類都不會打印引用指針。 – BackSlash 2014-12-19 08:44:43
好的,但有沒有辦法告訴它的一個類是否在項目中聲明,而不是內部的java? – buddy123 2014-12-19 08:46:37
@ e-r-a-n您可以檢查軟件包名稱。但是這並不能解決是否知道'toString()'是否被覆蓋的問題。這是你的最終目標嗎?如果是這樣,請參閱[檢測對象是否覆蓋toString()](http://stackoverflow.com/q/22866925)。 – 2014-12-19 08:46:57