是否可以用jni增强反射性能?

时间:2012-09-18 14:42:39

标签: java reflection java-native-interface

在我的代码中,我做了很多反射查找,所以我试图以某种方式改进它。

这是我的jni setter方法的一个示例:

JNIEXPORT jobject JNICALL 
Java_org_orman_mapper_Model_fieldSetFloat(JNIEnv * env, jobject  obj, jobject model, jstring field_name, jstring field_type, jfloat value, jclass clazz)
{
    const char* utf_string_name = (*env)->GetStringUTFChars (env, field_name, 0);
    const char* utf_string_type = (*env)->GetStringUTFChars (env, field_type, 0);

    jfieldID id = (*env)->GetFieldID(env, clazz, utf_string_name, utf_string_type);
    (*env)->SetFloatField(env, model, id, value);
    return model;
}

SetFloatField这样的调用的内在函数是否会跳过任何java安全检查?

我没有注意到任何性能提升。

1 个答案:

答案 0 :(得分:6)

  

是否可以使用jni增强反射性能?

可能,有点。但是,虽然您可以消除“不需要的”访问检查,但是由于您必须进行JNI调用才能访问对象的内部,所以会丢失一些。相反,反射方法及其调用序列的实现可以以常规JNI方法不可用的方式进行优化。

(例如,它们可以被实现为直接访问相关的数据结构而不是使用独立于平台的JNI API。或者JIT编译器可以将本机方法调用处理为某些“内在”本机方法作为特殊情况......和使用更快的调用序列。请注意,这都是假设的...但是在某些JVM中,某些核心方法的本机实现已经过特殊处理以使它们更快。)


但我的建议是,如果用常规的非反射Java代码替换反射代码,无论是手写代码,还是生成为的代码,您将获得更好的性能(数量级或更多)源和编译,或作为字节码生成的代码。一旦你有字节码,JIT编译器就能够生成优化的本机代码,这比使用反射或JNI要快得多。

因此,不要用JNI代码替换反射(及其相关问题),而应将其替换为使用纯字节码的东西。