圖像和聲音文件(3)
接圖像和聲音文件及圖像和聲音文件(2)
↓↓↓↓↓↓
不過,可以調(diào)用Fleld、Pethod或constructor對象的setAccessible方法覆蓋Java的訪問控制。例如,
t.setkcessible(true);// now OK to call f.get(harry)
setkccessible方法是AccessibleObject類中的一個方法,它是Field、Wethod和Constructor類的公共超類。這個特性是為調(diào)試、持久存儲和類似機(jī)制提供的。本節(jié)稍后將利用它編寫一個通用的toString方法。
如果不允許訪問,setAccessible調(diào)用會拋出一個異常。訪問可以被模塊系統(tǒng)(見卷Ⅱ的第9章)或安全管理器(卷IⅡ的第10章)拒絕。安全管理器并不常用。不過,在Java9中,由于JavaAPI是模塊化的,每個程序都包含模塊。
由于太多的庫都使用了反射,所以當(dāng)你使用反射訪問一個模塊中的非公共特性時,Java9和10只會給出一個警告。例如,本節(jié)最后的示例程序會查看ArrayList和Integer對象的內(nèi)部。運(yùn)行這個程序時,控制臺上會出現(xiàn)以下看起來不太妙的消息:
WARNING: An illegal reflective access operation has occurred
MARNING:Illegal reflective access by objectAnalyzer.ObjectAnalyzer(file:/home/cay
/books/cj11/code/v1ch05/bin/) to field java.util.ArrayList.serialVersionUID
WARNING: Please consider reporting this to the maintainers of
objectAnalyzer.ObjectAnalyzer
MARNING: 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
對目前而言,可以禁用這些警告。需要把java.base 模塊中的 java.util和 java.lang包“開”為“無名的模塊”。詳細(xì)內(nèi)容參見卷Ⅱ的第9章。語法如下:
java .add-opens java.base/java.util=ALL-UMAMED\
--add-opens java.base/java.\
( ̄ω ̄) [摸摸頭]:
explicitParametars
調(diào)用,作為隱式參數(shù)。使用包裝靠考數(shù),并返回方法的真的的
包裝的。