簡體   English   中英

JDK 1.8 和 JDK 16 之間的反射差異

[英]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.

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