繁体   English   中英

通过使用反射在 JNI 中查找 Java class 是否是最终的

[英]Finding if a Java class is final in JNI by using reflection

我试图通过使用反射从 C++ (jni) 中找到 java class 是否是最终的。 因此,在 JNI 中有下一个 Java 方法:

int modifiers = com.package_name.class_name.class.getModifiers();
Modifier.isFinal(mofidiers);

一切正常,直到调用Modifier.isFinal()的反射,它错误地报告非最终 class 实际上是最终的。

我已经验证了 Modifiers.getModifiers 结果,并且正如预期的那样,当它不是 final 时它正确返回1 ,而当 final 返回17时。 然而 Modifiers.IsFinal() 也为“1”值结果返回 True,它是公共的而不是最终的。

如果 Java 不会发生此问题,仅在 Jni 中。 而且我不希望直接与数字结果进行比较。

jboolean test(JNIEnv* env)
{
    jclass class_Modifier = env->FindClass("java/lang/reflect/Modifier");
    jmethodID method_isFinal = env->GetStaticMethodID(class_Modifier, "isFinal", "(I)Z");

    jclass class_Class = env->FindClass("java/lang/Class");
    jmethodID method_getModifiers = env->GetMethodID(class_Class, "getModifiers", "()I");

    jclass class_Test = env->FindClass("com/package_name/Test");
    jint modifiers = env->CallIntMethod(class_Test, method_getModifiers);
    return env->CallBooleanMethod(class_Modifier, method_isFinal, modifiers);
} 

问题是isFinal是一个 static 方法,所以:

替换这个:

env->CallBooleanMethod(class_modifier, method_isFinal, modifiers)

这样:

env->CallStaticBooleanMethod(class_modifier, method_isFinal, modifiers)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM