Я пытаюсь выяснить, является ли класс Java окончательным из C ++ (jni), используя отражение.Таким образом, при наличии следующих методов Java в JNI:
int modifiers = com.package_name.class_name.class.getModifiers();
Modifier.isFinal(mofidiers);
Все работает нормально, пока не будет вызвано отражение для Modifier.isFinal()
, которое неправильно сообщает, что не финальный класс на самом деле является финальным.
Я проверил результаты Modifiers.getModifiers, и, как и ожидалось, когда он не окончательный, он возвращает корректно 1 , а когда окончательный возвращает 17 .Тем не менее, Modifiers.IsFinal () также возвращает True для результата значения «1», который является открытым и не окончательным.
Эта проблема не возникает, если 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");
jclass class_app = env->FindClass("com/package_name/Test");
jmethodID method_getModifiers = env->GetMethodID(class_Class, "getModifiers", "()I");
jint modifiers = env->CallIntMethod(class_app, method_getModifiers);
return env->CallBooleanMethod(class_modifier, method_isFinal, modifiers);
}