本机方法可以调用私有方法吗?

时间:2012-08-31 03:09:24

标签: java

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

2 个答案:

答案 0 :(得分:22)

{10}在“10.9违反访问控制规则”中说明了这一点:

  

“JNI不会强制执行类,字段和方法访问控制限制,这些限制可以通过使用私有和最终修饰符在Java编程语言级别表达。可以将本机代码写入访问或修改对象的字段,即使在Java编程语言级别这样做会导致IllegalAccessException。JNI的允许性是一种有意识的设计决策,因为本机代码可以访问和修改堆中的任何内存位置。“

所以问题的答案是:

  

可以调用私有方法吗?

  

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

任何课程。

  

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

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

答案 1 :(得分:3)

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

以下是有关功能和指针的JNI文档的相关部分:http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/design.html#wp16696