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

2022-09-05 00:32:09

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


答案 1

JNI 程序员指南和规范在“10.9 违反访问控制规则”中是这样说的:

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

因此,您的问题的答案是:

它可以调用私有方法吗?

是的。

如果它是 YES,那么只在同一类或任何其他类中?

任何类。

如果它能叫别人的,那么这是一个也许是危险的问题吗?也就是说,它打破了规则。

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


答案 2

您可以对通过 JNI 接口传递给本机方法的 Java 对象调用私有方法。这与Java中调用其他Java对象的方法不是一回事。您必须非常小心,因为 JNI 不会强制实施通过使用修饰符(如 和 )来表示的类、字段和方法访问控制限制。所以它可能是危险的。例如,本机代码可以在 JIT 编译器内联类的常量字段后修改该常量字段。privatefinalfinal

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


推荐