Estoy tratando de encontrar si una clase Java es final de C ++ (JNI) mediante el uso de la reflexión. Por lo tanto, teniendo los siguientes métodos de Java en JNI:
int modifiers = com.package_name.class_name.class.getModifiers();
Modifier.isFinal(mofidiers);
Todo funciona bien hasta llamar a la reflexión de Modifier.isFinal()
que informa incorrectamente que una clase no final es en realidad final.
He verificado los resultados Modifiers.getModifiers, y como se esperaba cuando no definitivo devuelve correctamente 1 , y cuando vuelve finales 17 . Sin embargo Modifiers.IsFinal () también devuelve True para el "1" número valor, que es público y no definitiva.
Este problema no ocurre si Java, sólo en Jni. Y yo preferiría no comparar directamente contra los resultados numéricos.
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);
}
El problema es que isFinal es un método estático, por lo que:
Reemplazar esta:
env->CallBooleanMethod(class_modifier, method_isFinal, modifiers)
Por esto:
env->CallStaticBooleanMethod(class_modifier, method_isFinal, modifiers)