一、什麼是getDeclaredField方法?
在Java語言中,使用getDeclaredField方法可以通過反射的方式來獲取類中的成員變量(屬性)。
在使用getDeclaredField方法時需要注意,其只能獲取到當前類中聲明的成員變量,不能獲取到父類中聲明的成員變量,如果想要獲取到所有成員變量,可以使用getFields方法。
二、如何使用getDeclaredField方法實現類的屬性訪問?
下面我們通過一個例子來演示使用getDeclaredField方法實現類的屬性訪問。
public class Person { private String name; private int age; public Person() { this.name = "Tom"; this.age = 20; } } public class Test { public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException { Person person = new Person(); Field nameField = person.getClass().getDeclaredField("name"); nameField.setAccessible(true); String nameValue = (String)nameField.get(person); System.out.println("Person's name is " + nameValue); } }
代碼解釋:
首先定義了一個Person類,其中包含一個私有屬性name和一個私有屬性age。然後在main方法中,我們首先創建了一個Person對象person,接着使用getDeclaredField方法獲取name屬性對應的Field對象nameField,此時我們還需要通過nameField.setAccessible(true)來設置這個Field對象的可訪問性,否則在使用get方法獲取屬性值的時候會拋出IllegalAccessException異常。最後我們使用nameField.get(person)方法獲取person對象中的屬性值,並將其強制轉換成String類型,最終輸出了這個Person對象的name屬性值。
三、getDeclaredField方法實現類的屬性修改
通過上面的例子,我們已經了解了如何使用getDeclaredField方法獲取類的屬性值,那麼如果我們想要修改類的屬性值怎麼辦呢?
public class Person { private String name; private int age; public Person() { this.name = "Tom"; this.age = 20; } public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } } public class Test { public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException { Person person = new Person(); Field nameField = person.getClass().getDeclaredField("name"); nameField.setAccessible(true); nameField.set(person, "Jerry"); System.out.println("Person's name is " + person.getName()); } }
代碼解釋:
我們在Person類中添加了setName和setAge方法,用於修改name和age屬性值。在main方法中,我們首先創建了一個Person對象person,接着使用getDeclaredField方法獲取name屬性對應的Field對象nameField,此時我們還需要通過nameField.setAccessible(true)來設置這個Field對象的可訪問性,否則在使用set方法設置屬性值的時候會拋出IllegalAccessException異常。最後我們使用nameField.set(person, “Jerry”)方法將person對象的name屬性值修改為”Jerry”,並使用person.getName()方法獲取name屬性值並輸出。
四、小結
通過本文的介紹,我們學習了在Java語言中使用getDeclaredField方法實現類的屬性訪問和修改。需要注意的是,使用getDeclaredField方法時需要注意該方法只能獲取當前類中聲明的成員變量,不能獲取父類中的成員變量;在設置Field對象的可訪問性時需要調用setAccessible(true)方法;在使用set方法設置屬性值時需要注意當前類的實例對象需要是可訪問的。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/197407.html