我正在设计一个Java库,它使用一段通过JNI公开的本地代码。标准库提供了一个类,该类映射到一个不容易序列化的复杂本机结构体。我还没有决定是否应该将这个结构体存储在ByteBuffer
字段中,或者使用int
字段引用初始化结构体数组中的索引。
在这两种情况下,都存在一个潜在的问题,即用户代码可能试图修改ByteBuffer
/int
,并导致未定义的行为(非法结构位表示,越界数组访问,…)。当然,通过反射弄乱私有字段不符合用户的利益,但我认为Java是一种安全的语言(就UBs或段错误而言),仅仅是我的错误就可能导致这些问题,这让我很恼火。
Java是否有一种方法来强制实际的封装,所以字段实际上是完全私有的?其他原生库如何处理这个问题,如果它们一开始就关心的话?
谢谢你的帮助。
最后,只有final
原语不能通过反射修改。但说实话,我不知道如何使用Java代码来修改完全保存在JVM之外且仅由JNI代码管理的数据结构(好吧,Java代码可以调用JNI代码提供的API来修改该数据结构,但这里不是指这个)。
所以根据你的描述,你应该保存整数作为"外部"结构的索引。