Поиск, является ли класс Java окончательным в JNI, используя отражение - PullRequest
0 голосов
/ 27 сентября 2019

Я пытаюсь выяснить, является ли класс 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);
} 

1 Ответ

2 голосов
/ 28 сентября 2019

Проблема в том, что isFinal является статическим методом, поэтому:

Замените это:

env->CallBooleanMethod(class_modifier, method_isFinal, modifiers)

На это:

env->CallStaticBooleanMethod(class_modifier, method_isFinal, modifiers)
...