我正在使用JNA. 本Pointer類代表了本地指針。訪問似乎是peer成員變量的指針地址似乎很常見。但是,他們確保您無法查詢它。為什么?如果您想使用它,推薦的獲取方式是什么?我寫了以下“黑客”:public static long getBaseAddress(Pointer pointer){ String stringPointer = pointer.toString(); String[] splitStringPointer = stringPointer.split("@"); int expectedSplitLength = 2; if (splitStringPointer.length != expectedSplitLength) { throw new IllegalStateException("Expected a length of " + expectedSplitLength + " but got " + splitStringPointer.length); } String hexadecimalAddress = splitStringPointer[1].substring("0x".length()); return parseLong(hexadecimalAddress, 16);}但是除了濫用這種toString()獲取地址的方法,難道就沒有別的辦法了嗎?我想使用Reflection比上述方法更少的方法,因為它也很脆弱。
2 回答

一只萌萌小番薯
TA貢獻1795條經驗 獲得超7個贊
雖然子類化(如在 technomage 的回答中)有效,但這是不必要的。 Pointer.nativeValue(p)
會給你p
的同行。
正如我對另一個答案的評論一樣,“除非您知道自己在做什么,否則不要使用它。” JNA 中的任何內容通常都不需要它。只有當您確實出于其他目的需要內存地址時,對等值才真正相關。您可以迭代從 0 開始的偏移量以完成習語,例如您在評論中發布的鏈接中的代碼示例。
Pointer 的 getter 都接受一個offset
參數,您也可以簡單地使用 返回一個指向原始對等值偏移量的指針share()
。

jeck貓
TA貢獻1909條經驗 獲得超7個贊
創建一個子類,Pointer
你可以對受保護的字段做任何你想做的事情。
通常,您不應直接訪問該值,將字段設置為 protected 的目的正是為了防止無意中犯此類錯誤。
添加回答
舉報
0/150
提交
取消