簡體   English   中英

Java:通過反射訪問私有字段(行為)

[英]Java: Accessing private field via reflection (behaviour)

Java初級; 使用反射可以訪問私有字段(不問如何, 問題1問題2 )確定。

我的問題與這種行為的性質有關。

  1. 有沒有限制? 我可以訪問我遇到的任何.class任何字段嗎?
  2. 在我的代碼中,一旦你將字段的可見性設置為“public” ,它是永久改變還是直到上下文的結尾(方法,如果,對於......)? 代碼如下
  3. 它是確定了的人呢? 我的意思是,StackOverflow的老年人程序員,這是一個安全漏洞嗎?

代碼[已編輯]:

  Field f = obj.getClass().getDeclaredField("field"); 
  if (...) {
     f.setAccessible(true);
     // f IS accesible
  }
  // is f accesible?

有沒有限制?

是的 - 你需要幾個JVM權限 (最值得注意的是accessDeclaredMemberssuppressAccessChecks ,在文檔中標有大而粗的警告)才能使用它; 如果您的JVM的安全配置文件有點嚴格(例如,備受詬病的applet),您的代碼將無法運行,因為這些權限將不可用。

它會永遠改變嗎?

是的,只要您的程序繼續運行,字段將保持可訪問狀態(只要您繼續使用您更改訪問權限的相同Field實例)。

這不好嗎?

不必要。 它允許java代碼使用私有字段序列化和反序列化對象,它允許復雜的模擬,可以簡化測試,它允許您查看您無法查看的地方。 然而,由於它打破了期望,你應該謹慎使用它,並確保用戶知道你需要額外的權限,“正在尋找引擎”。 文檔(見上文)非常清楚地表明這被認為是有風險的,只有當你知道自己在做什么時才應該允許它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM