【问题标题】:What is a native peer?什么是原生同行?
【发布时间】:2018-06-23 22:28:01
【问题描述】:

Native peer 在 Effective Java (2nd) 中定义如下

终结器的第二个合法用途涉及具有本地对等点的对象。 本地节点本地对象普通对象通过本地方法委托给它。 em> 因为 native peer 不是普通对象,所以当它的 Java peer 被回收时,垃圾收集器不知道它并且无法回收它。 p>

在另一个问题java peer 中举例说明。是 java 类 PrintHello 还是另一个使用 PrintHello 的类?

这里哪一部分被称为 Native Peer,哪一部分是 Java Peer,有什么例子吗?我了解 finalize 的使用,我只是对所引用的本地对等部分感到困惑。

【问题讨论】:

  • @DimaSan 我链接到这个确切的问题,它没有解释本地同行。
  • @DimaSan 这实际上是那个问题的反面,尽管最佳答案也回答了这个问题。
  • 这句话已经解释了什么是原生对等体(“一个普通对象通过原生方法委托给它的原生对象”),这句话还有什么不清楚的地方?

标签: java terminology


【解决方案1】:

本地对象不仅可以用 java 编程,还可以用特定于平台的语言,通常是 c 或汇编程序。

此代码分配的内存不能被 GC 释放。因此,您可能需要在终结器中对其进行清理。

本机对等点是 Java 对象的本机部分。

你可以在这里看到一个很好的例子: https://www.javaworld.com/article/2077520/learn-java/java-tip-23--write-native-methods.html

【讨论】:

  • 我知道什么是原生对象。我不知道什么是原生同行。
  • 它是对象的原生部分
  • 对象或代码的本机部分?即public native void printText ();void Happy_printText (struct HHappy *this) {...}
【解决方案2】:

一个简单的例子是原生窗口与JFrameJFrame 是一个 Java 对等体,但它需要一个(依赖于平台的)本机对等体来实际显示图形。

这就是为什么在摆脱JFrame 时需要调用dispose()。您需要显式地摆脱原生组件,因为 GC 无法触及它。

【讨论】:

  • 它是您正在使用的东西的本机组件。与 Java 部分相反。你只是因为命名而感到困惑吗?
  • 所以在链接的问题中,print_hello 类是本地对等点,对吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-24
  • 2018-09-27
相关资源
最近更新 更多