反射 getDeclaredField 報錯java.lang.NoSuchFieldException

  今日需求上除了需要導出excel,方便運營的統計與數據整理,對於導出,當然是做了無數個了,今日則主要說一個小細節,關於getDeclaredField的知識。

先說一下場景使用:

  1. 需要將信息和所需字段一一對應,然後放入excel,並找位置存儲;
  2. 將路徑存儲到服務器,便於調用方直接讀取;

  使用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();
		}
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章