12

我知道在 JAVA 中“native”是一件特别的事情。它可以做很多事情。但我现在无法阅读。我不知道如何...我知道它可以在 JAVA 中调用其他方法。我的问题是:它可以调用私有方法吗?如果是,那么只能在同一个班级或任何其他班级?如果它可以调用其他的,那么它可能是一个危险的问题吗?也就是说,它违反了规则。我在哪里可以获得更多关于 NATIVE 的信息?谁能给我一个链接?

4

2 回答 2

32

JNI Programmer's Guide and Specification在“10.9 Violating Access Control Rules”中这样说:

“JNI 不强制执行类、字段和方法访问控制限制,这些限制可以通过使用 private 和 final 等修饰符在 Java 编程语言级别表示。可以编写本机代码来访问或修改对象,即使在 Java 编程语言级别这样做会导致IllegalAccessException.JNI 的许可是一个有意识的设计决定,因为本机代码无论如何都可以访问和修改堆中的任何内存位置。

所以你的问题的答案是:

它可以调用私有方法吗?

是的。

如果是,那么只能在同一个班级或任何其他班级?

任何班级。

如果它可以调用其他的,那么它可能是一个危险的问题吗?也就是说,它违反了规则。

设计者不尝试强制执行正常的 Java 访问规则的理由在上面引用的文本中清楚地说明了。是的,它有潜在的危险,但是任何使用 JNI 的行为都有潜在的危险。

于 2012-08-31T03:47:18.637 回答
5

您可以在通过 JNI 接口传递给本机方法的 Java 对象上调用私有方法。这与在 Java 中调用其他 Java 对象的方法不同。您必须非常小心,因为 JNI 不强制执行通过使用 和 等修饰符表达的类、字段和方法访问控制private限制final。所以它可能很危险。例如,本地代码可以final在 JIT 编译器内联后修改类的常量字段。

这是 JNI 文档中有关函数和指针的相关部分:http: //docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/design.html#wp16696

于 2012-08-31T03:26:43.397 回答