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

kan*_*eda 2 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;
}
Run Code Online (Sandbox Code Playgroud)

调用的内在因素SetFloatField,是否会跳过任何java安全检查?

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

Ste*_*n C 6

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

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

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


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

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