java field, property,variable及getField和getDeclaredField的區別


java 里面的field ,property, attribute,variable的區別

field: 就是定義的用於保存數據的字段

property: property是用於描述類中的特征,所以property比field的含義要廣,因為特征包含的方面更加廣,一個數據可以代表某方面的特征,但是並不是所有的特征都是你要的數據,它可能是類本身的某個特性的描述。

variable:變量,就是我們平時看到的變量。

 

綜上:如果你要想通過反射來獲取某個數據模型里面的字段的話跟Field相關,跟其它的沒多大關系。

getField:獲取某個類的所有public字段(包含所繼承的類的所有字段)

需要注意的是getField這個方法有很多的條件限制:在api文檔里面提到了,如果某個類(這里取名類A),類A中如果不包含public關鍵字修飾的Field,或類A是一個數組類型,原子類型(byte,short,int,long,char,float,double,boolean),無返回值類型的時候,這個方法返回的數組是一個長度為0的數組。假如你通過這個方法得到了要返回的字段了,這些字段是所有它的繼承與實現的父類,接口,及自身的字段列表。注意public申明的是字段而不是說你的get,set 方法是用public關鍵字生命的,假如的定義的成員變量 a 這個字段沒有public申明那么通過這個方法是取不到的。這里面有一句話蠻難理解的是“類A是一個數組類型,原子類型(byte,short,int,long,char,float,double,boolean),無返回值類型的時候”,它的意思是這個類型是你對象申明的類型,數組類型是 int []這種,而不是說你的類繼承了Array這個類型。以下舉個例子就理解了。

private static String[] fieldNamesOfClass(Class aClass){
if(aClass == null){
return null;
}
Field fields[] = aClass.getFields();
int length = fields.length;
String fieldNames[] = new String[length];
for (int i=0; i<length; i++){
Field field = fields[i];
fieldNames[i] = field.getName();
}

System.out.printf(fieldNames.toString());

return fieldNames;
}
int []xx = new int[3];
String[] xxfieldNames = fieldNamesOfClass(xx);

int yy = 3;
String[] yyfieldNames = fieldNamesOfClass(yy);

getDeclaredField:獲取當前類的字段(包含public,protected,private修飾的所有字段,不包含其所繼承類的字段),所以如果你要對某個數據模型做反射的話要注意里面的字段的定義,不要冗余了

(當然你的類或接口里面沒有過申明字段,那么你掉上面那兩個方法是沒有一點意義的。返回的都是長度為0的數組)

獲取反射字段的方法是用 getDeclaredField;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM