1

只有在先前实例化了该类的实例时,FindClass 才会成功吗?

如果是这样,实例化类的一次性实例以使随后对 FindClass 的调用成功的成本最低的方法是什么?

或者,是否有另一种适用于未实例化类的 JNI 方法?

(在我的例子中,我试图查找的类只有静态方法。我希望我的本机代码能够调用这些 Java 类静态方法之一。)

-艾伦

4

1 回答 1

1

只有在先前实例化了该类的实例时,FindClass 才会成功吗?

不会。它会找到您的应用程序的类加载器知道的任何类。实例化与否。

只要只调用静态方法并使用静态类成员,就不会创建实例。Java 在创建实例方面非常懒惰。甚至静态初始化块的执行时间也比预期的要晚,请参阅获取静态初始化块以在 java 中运行而不加载类

当你仔细阅读 JNI 文档时,你会发现CallStatic<type>Methodfamilyjclass作为参数,而Call<type>Methodjobject. 我认为这种差异说明了一切。

最重要的是:Java 中没有像“一次性实例”这样的东西。您可能会想到 C++ 风格,在堆栈上创建的作用域实例。不能命令 Java 这样做,所有内容都是在堆上动态分配的,并且范围由垃圾收集的引用计数和调度确定。

于 2012-09-28T13:54:22.660 回答