java - 使用反射查找 JNI 中的 Java 类是否为 Final

标签 java android reflection java-native-interface final

我试图通过使用反射来查找 Java 类是否是来自 C++ (jni) 的最终类。因此,在 JNI 中包含以下 Java 方法:

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

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

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

如果是 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 是静态方法,因此:

替换这个:

env->CallBooleanMethod(class_modifier, method_isFinal, modifiers)

通过这个:

env->CallStaticBooleanMethod(class_modifier, method_isFinal, modifiers)

关于java - 使用反射查找 JNI 中的 Java 类是否为 Final,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58130302/

相关文章:

Android - 什么替代了 NineOldAndroids 动画库?

Scala:为反射/运行时实例使用正确的类型类实例

java - Java 的已检查异常处理是否已损坏?

java - 无法从数据库获取正确的数据

java - Retrofit 2 - 如何在没有 Call 对象的情况下发出请求

java - 我希望这段代码从 android studio 循环

android - 在 Android 上,是否可以在对话框中显示数据表?

c# - 通过发射/反射初始化类字段

java - 如何使用 httpclient 发送 url post

java - 一段时间后关闭异步任务