通过使用反射查找 Java class 在 JNI 中是否是最终的
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 结果,正如预期的那样,当它不是最终结果时 returns 正确 1,当最终结果 returns 17。然而 Modifiers.IsFinal() 也 returns 对于“1”值结果为真,即 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)
我正在尝试使用反射从 C++ (jni) 中查找 java class 是否是最终的。因此,在 JNI 中有下一个 Java 方法:
int modifiers = com.package_name.class_name.class.getModifiers();
Modifier.isFinal(mofidiers);
一切正常,直到为 Modifier.isFinal()
调用反射,它错误地报告非最终 class 实际上是最终的。
我已经验证了 Modifiers.getModifiers 结果,正如预期的那样,当它不是最终结果时 returns 正确 1,当最终结果 returns 17。然而 Modifiers.IsFinal() 也 returns 对于“1”值结果为真,即 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)