/* * Get the named field. */ Object* dvmGetDeclaredField(ClassObject* clazz, StringObject* nameObj) { int i; Object* fieldObj = NULL; char* name = dvmCreateCstrFromString(nameObj); if (!dvmIsClassInitialized(gDvm.classJavaLangReflectField)) dvmInitClass(gDvm.classJavaLangReflectField); for (i = 0; i < clazz->sfieldCount; i++) { Field* field = &clazz->sfields[i]; if (strcmp(name, field->name) == 0) { fieldObj = createFieldObject(field, clazz); break; } } if (fieldObj == NULL) { for (i = 0; i < clazz->ifieldCount; i++) { Field* field = &clazz->ifields[i]; if (strcmp(name, field->name) == 0) { fieldObj = createFieldObject(field, clazz); break; } } } free(name); return fieldObj; }
ObjectArray* Java_java_lang_Class_getDeclaredFields0(Env* env, Class* clazz, jboolean publicOnly) { if (CLASS_IS_PRIMITIVE(clazz) || CLASS_IS_ARRAY(clazz)) return NULL; Field* fields = rvmGetFields(env, clazz); if (rvmExceptionCheck(env)) return NULL; Field* field; jint length = 0; for (field = fields; field != NULL; field = field->next) { if (!publicOnly || FIELD_IS_PUBLIC(field)) { length++; } } ObjectArray* result = NULL; jint i = 0; for (field = fields; field != NULL; field = field->next) { if (!publicOnly || FIELD_IS_PUBLIC(field)) { Object* c = createFieldObject(env, field); if (!c) return NULL; if (!result) { result = rvmNewObjectArray(env, length, c->clazz, NULL, NULL); if (!result) return NULL; } result->values[i++] = c; } } return result; }
/* * JNI reflection support: convert Field to reflection object. * * The return value is a java.lang.reflect.Field. * * Caller must call dvmReleaseTrackedAlloc(). */ Object* dvmCreateReflectObjForField(const ClassObject* clazz, Field* field) { if (!dvmIsClassInitialized(gDvm.classJavaLangReflectField)) dvmInitClass(gDvm.classJavaLangReflectField); /* caller must dvmReleaseTrackedAlloc(result) */ return createFieldObject(field, clazz); }
/* * * Get an array with all fields declared by a class. * * This includes both static and instance fields. */ ArrayObject* dvmGetDeclaredFields(ClassObject* clazz, bool publicOnly) { if (!dvmIsClassInitialized(gDvm.classJavaLangReflectField)) dvmInitClass(gDvm.classJavaLangReflectField); /* count #of fields */ size_t count; if (!publicOnly) count = clazz->sfieldCount + clazz->ifieldCount; else { count = 0; for (int i = 0; i < clazz->sfieldCount; i++) { if ((clazz->sfields[i].accessFlags & ACC_PUBLIC) != 0) count++; } for (int i = 0; i < clazz->ifieldCount; i++) { if ((clazz->ifields[i].accessFlags & ACC_PUBLIC) != 0) count++; } } /* create the Field[] array */ ArrayObject* fieldArray = dvmAllocArrayByClass(gDvm.classJavaLangReflectFieldArray, count, ALLOC_DEFAULT); if (fieldArray == NULL) return NULL; /* populate */ size_t fieldCount = 0; for (int i = 0; i < clazz->sfieldCount; i++) { if (!publicOnly || (clazz->sfields[i].accessFlags & ACC_PUBLIC) != 0) { Object* field = createFieldObject(&clazz->sfields[i], clazz); if (field == NULL) { goto fail; } dvmSetObjectArrayElement(fieldArray, fieldCount, field); dvmReleaseTrackedAlloc(field, NULL); ++fieldCount; } } for (int i = 0; i < clazz->ifieldCount; i++) { if (!publicOnly || (clazz->ifields[i].accessFlags & ACC_PUBLIC) != 0) { Object* field = createFieldObject(&clazz->ifields[i], clazz); if (field == NULL) { goto fail; } dvmSetObjectArrayElement(fieldArray, fieldCount, field); dvmReleaseTrackedAlloc(field, NULL); ++fieldCount; } } assert(fieldCount == fieldArray->length); /* caller must call dvmReleaseTrackedAlloc */ return fieldArray; fail: dvmReleaseTrackedAlloc((Object*) fieldArray, NULL); return NULL; }