簡體   English   中英

如何為非法反射訪問警告拋出異常?

[英]How can I throw an exception for an illegal reflective access warning?

如何為非法反射訪問警告拋出異常? 例如,考慮以下代碼:

import org.apache.commons.lang3.builder.*;

class Test {
    public static void main(String[] args) {
        System.out.println(ReflectionToStringBuilder.toString(Boolean.TRUE));
    }
}

此代碼向 System.err 打印以下警告:

WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.apache.commons.lang3.builder.ReflectionToStringBuilder (file:/Users/brianschack/eclipse-workspace/User%20Libraries/com
mons-lang3-3.7/commons-lang3-3.7.jar) to field java.lang.Boolean.value
WARNING: Please consider reporting this to the maintainers of org.apache.commons.lang3.builder.ReflectionToStringBuilder
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release

Boolean.TRUE 是一個如此簡單的值,我真的不需要 ReflectionToStringBuilder。 但是更復雜的類型(例如 HashMap)會打印相同的警告。 我選擇 Boolean.TRUE 是為了簡化這個例子。

當我搜索此警告消息時,我發現建議將其報告給包維護者、避免警告或完全禁用它( JDK9:發生非法反射訪問操作。org.python.core.PySystemState )。

我想為警告拋出異常,以便獲得非法訪問發生位置的堆棧跟蹤。 然后我可以更改代碼以避免導致警告的非法訪問。 我還想做一個單元測試,以便將來檢查警告。

我試圖根據 StackOverflow 問題,即System.out.println() 的 JUnit 測試來測試是否打印到 System.err。 這涉及將 System.err 設置為 ByteArrayOutputStream,然后檢查內容。 但不幸的是,根據如何在沒有 JVM 參數的情況下在 java 9 中隱藏警告“非法反射訪問”? ,IllegalAccessLogger 在 JVM 引導期間獲得對 System.err 的引用,然后我才能更改它。

我也嘗試關閉 System.err,但似乎打印到關閉的流會以靜默方式失敗而不是引發異常。 請注意,以下代碼的輸出不包含字符串“err-2”:

代碼:

class Test {
    public static void main(String[] args) {
        System.out.println("Start");
        System.err.println("err-1");
        System.err.close();
        System.err.println("err-2");
        System.out.println("End");
    }
}

輸出:

Start
err-1
End
  1. 打開 Eclipse 開發環境。
  2. 選擇運行菜單 –> 運行配置... –> Java 應用程序 –>(您的配置) –> 參數。
  3. 在 VM 參數文本框中,鍵入“--illegal-access=deny”[0]。
  4. 單擊應用按鈕。
  5. 單擊運行按鈕。
  6. 非法訪問將拋出 java.lang.reflect.InaccessibleObjectException [1]。

[0] http://mail.openjdk.java.net/pipermail/jigsaw-dev/2017-May/012673.html

[1] http://docs.oracle.com/javase/9​​/docs/api/java/lang/reflect/InaccessibleObjectException.html

暫無
暫無

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

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