Encontrar si una clase Java es definitiva en JNI mediante el uso de la reflexión

PerracoLabs:

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);
} 
API_1024:

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)

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=332793&siteId=1
Recomendado
Clasificación