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

问题描述 投票:9回答:2

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

java
2个回答
26
投票

JNI Programmer's Guide and Specification在“ 10.9违反访问控制规则”中说:

“ JNI并不强制通过使用修饰符(例如private和final)可以在Java编程语言级别表达的类,字段和方法访问控制限制。可以编写用于访问或访问的本机代码。修改对象的字段,即使在Java编程语言级别这样做也会导致IllegalAccessException。考虑到本机代码始终可以访问和修改堆中的任何内存位置,JNI的允许性是一个有意识的设计决策。“]

所以您的问题的答案是:

它可以调用私有方法吗?

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

任何班级。

如果它可以呼叫其他人,那么这是否很危险?也就是说,它违反了规则。

设计人员不尝试强制执行常规Java访问规则的理由在上面引用的文本中明确说明。是的,它有潜在危险,但是any

使用JNI可能有危险。

3
投票

您可以在通过JNI接口传递给本机方法的Java对象上调用私有方法。这与在Java中调用其他Java对象上的方法不同。您必须非常小心,因为JNI不会强制使用通过使用修饰符(例如privatefinal)来表示的类,字段和方法访问控制限制。因此可能很危险。例如,在JIT编译器内联后,本机代码可以修改类的final常量字段。这是JNI文档中有关函数和指针的相关部分:http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/design.html#wp16696

© www.soinside.com 2019 - 2024. All rights reserved.