[英]Differences in reflection between JDK 1.8 and JDK 16
以下語句在 Oracle JDK1.8 和 OpenJDK 16 中均執行,但返回的結果不同。 在日常開發過程中建立,令人困惑的問題是差異是有意如此還是只是一個模糊的錯誤? 我已經完成了對類似問題的搜索,但沒有找到預期的問題。
例子,
Field[] declaredFields = Field.class.getDeclaredFields();
// Field[12] with all private fields which are expected. (JDK 1.8)
// Empty field array. (JDK 16)
通過調試模式,關鍵語句位於:jdk.internal.reflect.Reflections中的第293、309行。 這些方法沒有 javadoc。
// line 293
return (Field[])filter(fields, fieldFilterMap.get(containingClass));
// line 309
if (filteredNames.contains(WILDCARD)) {
return (Member[]) Array.newInstance(memberType, 0);
}
這不是一個不起眼的錯誤,而是有意為之。
盡管filterFields()
方法沒有 JavaDoc 注釋,但引用的fieldFilterMap
字段具有 ( https://github.com/openjdk/jdk9/blob/master/jdk/src/java.base/share/classes/jdk/內部/反射/反射.java#L42 )
用於從公共視圖中過濾掉某些類中敏感的字段和方法,或者它們可能包含 VM 內部對象。
由於引用的源代碼來自 Java 9,它是有意引入的,與Java 16 源代碼的比較表明,從那時起排除字段的數量有所增加。
有沒有辦法繞過這個限制? 我不這么認為。
根據問題跟蹤器:改進對具有安全敏感字段的類的過濾:
由核心反射維護的過濾器是一種有用的帶狀輔助,可避免將 Field 或 Method 對象泄漏給不受信任的代碼。 可以改進過濾機制,從高度安全敏感的類中過濾掉所有字段,例如 Class、ClassLoader 和一些 java.lang.reflect 類。
繞過此限制的所有方式都可能被視為安全問題,並將在下一個安全更新中關閉。
不幸的是,您沒有說明為什么需要此訪問權限。 您需要更改代碼以不依賴對這些字段的訪問。
另請注意,大多數字段都可以通過 getter 方法訪問。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.