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);
}