Java 访问JNA指针';同侪价值观
我正在使用。该类表示本机指针。访问指针的地址(似乎是成员变量)似乎很常见。但是,他们确保您不能查询它。为什么?如果你想使用它,推荐的方法是什么 我写了以下“黑客”: 但是除了滥用Java 访问JNA指针';同侪价值观,java,pointers,jna,Java,Pointers,Jna,我正在使用。该类表示本机指针。访问指针的地址(似乎是成员变量)似乎很常见。但是,他们确保您不能查询它。为什么?如果你想使用它,推荐的方法是什么 我写了以下“黑客”: 但是除了滥用toString()方法获取地址之外,难道没有其他合适的方法吗 我想使用比上述方法更少的方法,因为它也很脆弱。创建指针的子类,您可以对受保护的字段执行任何操作 一般来说,您不应该直接访问该值,使字段受保护的目的正是为了避免无意中犯此类错误。虽然子类化(如technomage的回答)有效,但它是不必要的。将为您提供p的同行
toString()
方法获取地址之外,难道没有其他合适的方法吗
我想使用比上述方法更少的方法,因为它也很脆弱。创建
指针的子类
,您可以对受保护的字段执行任何操作
一般来说,您不应该直接访问该值,使字段受保护的目的正是为了避免无意中犯此类错误。虽然子类化(如technomage的回答)有效,但它是不必要的。将为您提供p
的同行
正如我对另一个答案的评论,“除非你知道自己在做什么,否则不要使用这个。”JNA内部的任何东西通常都不需要它。只有当您确实需要内存地址用于其他目的时,对等值才是真正相关的。您可以迭代从0开始的偏移量,以实现习惯用法,如您在注释中发布的中的代码示例
指针的getter都接受一个
offset
参数,您也可以使用返回一个指向原始对等值偏移量的指针。Stephen给出了一些很好的理由来解释为什么不应该这样做。也就是说,当面临解析toString和反射之间的选择时,您几乎肯定会更喜欢反射。虽然两者都很脆弱,但与解析toString相比,反射更适合于检查类成员,正如您在这里所做的那样。@AndreyAkhmetov:您能链接到Stephen(无论他是谁)的声明吗?Stephen删除了他的答案,但在撰写我的评论时,它已出现在这篇帖子上。我不知道他为什么要删除它,我也无法验证它是否正确,但我关于反射与toString的陈述仍然有效。如果你想像在这个C++
代码示例中那样不断增加值,那么直接访问值怎么会是一个错误?1.获取值2。增量3。创建一个新的指针对象4。重复一遍,这很好,不是吗?与其说是一个错误,不如说是一个“通常你不应该”。正如对等构造函数的Javadoc所述,“除非您知道自己在做什么,否则不要使用它。”还有其他方法(例如偏移量、share()
等)可以访问与原始指针偏移量处的内存,我认为这是更可取的。谢谢,这是更合适的解决方案。
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);
}