透過 Java 反射存取私有欄位
透過反射存取私有欄位是 Java 程式設計中一個有爭議的議題。透過這種技術,人們可以繞過封裝施加的存取限制並檢索私有欄位的值,從而引發對違反封裝原則的擔憂。
考慮以下範例:
class Test { private String str; public void setStr(String value) { str = value; } }
問題出現了:是否可以使用以下方式取得私有欄位 'str' 的值反射?
答案:
是的,確實可以,只要授予適當的安全權限。透過利用 Field.setAccessible(true) 方法,您可以授予對不同類別的私有欄位的存取權限。
以下程式碼片段示範如何實現此目的:
import java.lang.reflect.*; class Other { private String str; public void setStr(String value) { str = value; } } class Test { public static void main(String[] args) // Just for the ease of a throwaway test. Don't // do this normally! throws Exception { Other t = new Other(); t.setStr("hi"); Field field = Other.class.getDeclaredField("str"); field.setAccessible(true); Object value = field.get(t); System.out.println(value); } }
警告:
強烈建議不要在典型場景中存取私有欄位。透過這樣做,您忽略了類別的封裝機制,可能會覆寫基本的驗證檢查或意外地修改其他欄位。
以上是Java反射能否繞過封裝存取私有欄位?的詳細內容。更多資訊請關注PHP中文網其他相關文章!