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;