今日需求上除了需要導出excel,方便運營的統計與數據整理,對於導出,當然是做了無數個了,今日則主要說一個小細節,關於getDeclaredField的知識。
先說一下場景使用:
- 需要將信息和所需字段一一對應,然後放入excel,並找位置存儲;
- 將路徑存儲到服務器,便於調用方直接讀取;
使用getDeclaredField則是對於步驟一的存值出現了問題。爲什麼會出現問題呢?因爲自己考慮不周到,導出的字段是多餘數據庫存儲字段的,需要自己再另外增加統計啥的,所以採用了一個實體繼承的方式,對於平時的傳值是沒有任何問題的。但是在導出取值的時候卻真是遇到了問題啊。
首先明白兩點:
1、繼承的概念
繼承就是子類繼承父類的特徵和行爲,使得子類對象(實例)具有父類的實例域和方法,或子類從父類繼承方法,使得子類具有父類相同的行爲。但是說到底還是同屬於兩個類的。但是說到最終,依舊還是同屬於兩個類的。
2、反射的概念
JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意方法和屬性;這種動態獲取信息以及動態調用對象方法的功能稱爲java語言的反射機制。
導出遇到的問題截圖:
導出遇到的文字描述:
java.lang.NoSuchFieldException: id
這就是因爲自己的id屬性其實是在繼承的父類裏邊的。接下來通過一個小demo,深刻感受一下。
/**
* @Author:HuoYaJing
* @Description: 動物父類
* @Date: Create in 16:14 2020-06-16
*/
public class Animal {
/**
* 年齡
*/
private int age;
/**
* 性別
*/
private boolean sex;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isSex() {
return sex;
}
public void setSex(boolean sex) {
this.sex = sex;
}
}
/**
* @Author:HuoYaJing
* @Description:Dog子類
* @Date: Create in 16:26 2020-06-16
*/
public class Dog extends Animal {
/**
* 顏色
*/
private String furColor;
public String getFurColor() {
return furColor;
}
public void setFurColor(String furColor) {
this.furColor = furColor;
}
}
public static void main(String[] args) {
try {
//調用父類的屬性
Field field=Dog.class.getDeclaredField("age");
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
看結果:
public static void main(String[] args) {
try {
//調用子類自身的屬性
Field field=Dog.class.getDeclaredField("furColor");
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
看結果:
getDeclaredFiled 僅能獲取類本身的屬性成員(包括私有、共有、保護) ,對於父類信息是沒辦法返回的。那麼我就真的想獲取父類屬性,該如何處理呢?通過getSuperclass的之後再通過getDeclaredFiled獲取即可。
public static void main(String[] args) {
try {
//通過getSuperclass獲取父類屬性
Field field=Dog.class.getSuperclass().getDeclaredField("age");
System.out.println(field.getName());
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}