java_lang_reflect_Field.cpp revision f6c387128427e121477c1b32ad35cdcaa5101ba3
1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License. 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License. 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * java.lang.reflect.Field 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include "Dalvik.h" 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include "native/InternalNativePriv.h" 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get the address of a field from an object. This can be used with "get" 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * or "set". 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "declaringClass" is the class in which the field was declared. For an 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * instance field, "obj" is the object that holds the field data; for a 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * static field its value is ignored. 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "If the underlying field is static, the class that declared the 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * field is initialized if it has not already been initialized." 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On failure, throws an exception and returns NULL. 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The documentation lists exceptional conditions and the exceptions that 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * should be thrown, but doesn't say which exception previals when two or 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * more exceptional conditions exist at the same time. For example, 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * attempting to set a protected field from an unrelated class causes an 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * IllegalAccessException, while passing in a data type that doesn't match 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the field causes an IllegalArgumentException. If code does both at the 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * same time, we have to choose one or othe other. 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The expected order is: 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (1) Check for illegal access. Throw IllegalAccessException. 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (2) Make sure the object actually has the field. Throw 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * IllegalArgumentException. 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (3) Make sure the field matches the expected type, e.g. if we issued 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * a "getInteger" call make sure the field is an integer or can be 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * converted to an int with a widening conversion. Throw 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * IllegalArgumentException. 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (4) Make sure "obj" is not null. Throw NullPointerException. 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * TODO: we're currently handling #3 after #4, because we don't check the 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * widening conversion until we're actually extracting the value from the 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * object (which won't work well if it's a null reference). 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic JValue* getFieldDataAddr(Object* obj, ClassObject* declaringClass, 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int slot, bool isSetOperation, bool noAccessCheck) 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Field* field; 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JValue* result; 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project field = dvmSlotToField(declaringClass, slot); 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(field != NULL); 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* verify access */ 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!noAccessCheck) { 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (isSetOperation && dvmIsFinalField(field)) { 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmThrowException("Ljava/lang/IllegalAccessException;", 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project "field is marked 'final'"); 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return NULL; 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* callerClass = 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmGetCaller2Class(dvmThreadSelf()->curFrame); 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We need to check two things: 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (1) Would an instance of the calling class have access to the field? 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (2) If the field is "protected", is the object an instance of the 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * calling class, or is the field's declaring class in the same 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * package as the calling class? 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * #1 is basic access control. #2 ensures that, just because 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you're a subclass of Foo, you can't mess with protected fields 88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * in arbitrary Foo objects from other packages. 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!dvmCheckFieldAccess(callerClass, field)) { 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmThrowException("Ljava/lang/IllegalAccessException;", 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project "access to field not allowed"); 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return NULL; 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (dvmIsProtectedField(field)) { 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool isInstance, samePackage; 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (obj != NULL) 99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project isInstance = dvmInstanceof(obj->clazz, callerClass); 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project else 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project isInstance = false; 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project samePackage = dvmInSamePackage(declaringClass, callerClass); 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!isInstance && !samePackage) { 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmThrowException("Ljava/lang/IllegalAccessException;", 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project "access to protected field not allowed"); 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return NULL; 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (dvmIsStaticField(field)) { 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* init class if necessary, then return ptr to storage in "field" */ 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!dvmIsClassInitialized(declaringClass)) { 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!dvmInitClass(declaringClass)) { 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(dvmCheckException(dvmThreadSelf())); 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return NULL; 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = dvmStaticFieldPtr((StaticField*) field); 122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Verify object is of correct type (i.e. it actually has the 125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * expected field in it), then grab a pointer to obj storage. 126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The call to dvmVerifyObjectInClass throws an NPE if "obj" is NULL. 127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!dvmVerifyObjectInClass(obj, declaringClass)) { 129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(dvmCheckException(dvmThreadSelf())); 130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (obj != NULL) { 131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGD("Wrong type of object for field lookup: %s %s\n", 132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project obj->clazz->descriptor, declaringClass->descriptor); 133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return NULL; 135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = dvmFieldPtr(obj, ((InstField*) field)->byteOffset); 137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * public int getFieldModifiers(Class declaringClass, int slot) 144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_reflect_Field_getFieldModifiers( 146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const u4* args, JValue* pResult) 147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // ignore thisPtr in args[0] 149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* declaringClass = (ClassObject*) args[1]; 150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int slot = args[2]; 151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Field* field; 152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project field = dvmSlotToField(declaringClass, slot); 154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_INT(field->accessFlags & JAVA_FLAGS_MASK); 155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * private Object getField(Object o, Class declaringClass, Class type, 159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * int slot, boolean noAccessCheck) 160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Primitive types need to be boxed. 162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_reflect_Field_getField(const u4* args, 164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JValue* pResult) 165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // ignore thisPtr in args[0] 167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Object* obj = (Object*) args[1]; 168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* declaringClass = (ClassObject*) args[2]; 169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* fieldType = (ClassObject*) args[3]; 170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int slot = args[4]; 171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool noAccessCheck = (args[5] != 0); 172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JValue value; 173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const JValue* fieldPtr; 174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project DataObject* result; 175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project //dvmDumpClass(obj->clazz, kDumpClassFullDetail); 177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* get a pointer to the field's data; performs access checks */ 179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fieldPtr = getFieldDataAddr(obj, declaringClass, slot, false,noAccessCheck); 180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (fieldPtr == NULL) 181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_VOID(); 182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* copy 4 or 8 bytes out */ 184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (fieldType->primitiveType == PRIM_LONG || 185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fieldType->primitiveType == PRIM_DOUBLE) 186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project value.j = fieldPtr->j; 188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project value.i = fieldPtr->i; 190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = dvmWrapPrimitive(value, fieldType); 193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmReleaseTrackedAlloc((Object*) result, NULL); 194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_PTR(result); 195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * private void setField(Object o, Class declaringClass, Class type, 199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * int slot, boolean noAccessCheck, Object value) 200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * When assigning into a primitive field we will automatically extract 202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the value from box types. 203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_reflect_Field_setField(const u4* args, 205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JValue* pResult) 206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // ignore thisPtr in args[0] 208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Object* obj = (Object*) args[1]; 209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* declaringClass = (ClassObject*) args[2]; 210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* fieldType = (ClassObject*) args[3]; 211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int slot = args[4]; 212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool noAccessCheck = (args[5] != 0); 213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Object* valueObj = (Object*) args[6]; 214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JValue* fieldPtr; 215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JValue value; 216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* unwrap primitive, or verify object type */ 218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!dvmUnwrapPrimitive(valueObj, fieldType, &value)) { 219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmThrowException("Ljava/lang/IllegalArgumentException;", 220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project "invalid value for field"); 221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_VOID(); 222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* get a pointer to the field's data; performs access checks */ 225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fieldPtr = getFieldDataAddr(obj, declaringClass, slot, true, noAccessCheck); 226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (fieldPtr == NULL) 227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_VOID(); 228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* store 4 or 8 bytes */ 230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (fieldType->primitiveType == PRIM_LONG || 231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fieldType->primitiveType == PRIM_DOUBLE) 232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fieldPtr->j = value.j; 234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fieldPtr->i = value.i; 236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_VOID(); 239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Convert a reflection primitive type ordinal (inherited from the previous 243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * VM's reflection classes) to our value. 244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic PrimitiveType convPrimType(int typeNum) 246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static const PrimitiveType conv[PRIM_MAX] = { 248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project PRIM_NOT, PRIM_BOOLEAN, PRIM_BYTE, PRIM_CHAR, PRIM_SHORT, 249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project PRIM_INT, PRIM_FLOAT, PRIM_LONG, PRIM_DOUBLE 250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project }; 251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (typeNum <= 0 || typeNum > 8) 252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return PRIM_NOT; 253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return conv[typeNum]; 254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Primitive field getters, e.g.: 258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * private double getIField(Object o, Class declaringClass, 259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Class type, int slot, boolean noAccessCheck, int type_no) 260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The "type_no" is defined by the java.lang.reflect.Field class. 262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_reflect_Field_getPrimitiveField(const u4* args, 264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JValue* pResult) 265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // ignore thisPtr in args[0] 267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Object* obj = (Object*) args[1]; 268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* declaringClass = (ClassObject*) args[2]; 269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* fieldType = (ClassObject*) args[3]; 270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int slot = args[4]; 271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool noAccessCheck = (args[5] != 0); 272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int typeNum = args[6]; 273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project PrimitiveType targetType = convPrimType(typeNum); 274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const JValue* fieldPtr; 275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JValue value; 276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!dvmIsPrimitiveClass(fieldType)) { 278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmThrowException("Ljava/lang/IllegalArgumentException;", 279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project "not a primitive field"); 280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_VOID(); 281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* get a pointer to the field's data; performs access checks */ 284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fieldPtr = getFieldDataAddr(obj, declaringClass, slot, false,noAccessCheck); 285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (fieldPtr == NULL) 286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_VOID(); 287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* copy 4 or 8 bytes out */ 289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (fieldType->primitiveType == PRIM_LONG || 290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fieldType->primitiveType == PRIM_DOUBLE) 291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project value.j = fieldPtr->j; 293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project value.i = fieldPtr->i; 295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* retrieve value, performing a widening conversion if necessary */ 298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (dvmConvertPrimitiveValue(fieldType->primitiveType, targetType, 299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project &(value.i), &(pResult->i)) < 0) 300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmThrowException("Ljava/lang/IllegalArgumentException;", 302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project "invalid primitive conversion"); 303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_VOID(); 304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Primitive field setters, e.g.: 309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * private void setIField(Object o, Class declaringClass, 310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Class type, int slot, boolean noAccessCheck, int type_no, int value) 311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The "type_no" is defined by the java.lang.reflect.Field class. 313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_reflect_Field_setPrimitiveField(const u4* args, 315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JValue* pResult) 316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // ignore thisPtr in args[0] 318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Object* obj = (Object*) args[1]; 319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* declaringClass = (ClassObject*) args[2]; 320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* fieldType = (ClassObject*) args[3]; 321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int slot = args[4]; 322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool noAccessCheck = (args[5] != 0); 323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int typeNum = args[6]; 324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const s4* valuePtr = (s4*) &args[7]; 325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project PrimitiveType srcType = convPrimType(typeNum); 326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JValue* fieldPtr; 327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JValue value; 328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!dvmIsPrimitiveClass(fieldType)) { 330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmThrowException("Ljava/lang/IllegalArgumentException;", 331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project "not a primitive field"); 332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_VOID(); 333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* convert the 32/64-bit arg to a JValue matching the field type */ 336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (dvmConvertPrimitiveValue(srcType, fieldType->primitiveType, 337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project valuePtr, &(value.i)) < 0) 338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmThrowException("Ljava/lang/IllegalArgumentException;", 340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project "invalid primitive conversion"); 341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_VOID(); 342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* get a pointer to the field's data; performs access checks */ 345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fieldPtr = getFieldDataAddr(obj, declaringClass, slot, true, noAccessCheck); 346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (fieldPtr == NULL) 347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_VOID(); 348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* store 4 or 8 bytes */ 350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (fieldType->primitiveType == PRIM_LONG || 351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fieldType->primitiveType == PRIM_DOUBLE) 352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fieldPtr->j = value.j; 354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fieldPtr->i = value.i; 356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_VOID(); 359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * public Annotation[] getDeclaredAnnotations(Class declaringClass, int slot) 363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return the annotations declared for this field. 365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_reflect_Field_getDeclaredAnnotations( 367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const u4* args, JValue* pResult) 368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // ignore thisPtr in args[0] 370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* declaringClass = (ClassObject*) args[1]; 371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int slot = args[2]; 372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Field* field; 373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project field = dvmSlotToField(declaringClass, slot); 375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(field != NULL); 376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ArrayObject* annos = dvmGetFieldAnnotations(field); 378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmReleaseTrackedAlloc((Object*) annos, NULL); 379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_PTR(annos); 380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * private Object[] getSignatureAnnotation() 384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns the signature annotation. 386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_reflect_Field_getSignatureAnnotation(const u4* args, 388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JValue* pResult) 389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // ignore thisPtr in args[0] 391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* declaringClass = (ClassObject*) args[1]; 392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int slot = args[2]; 393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Field* field; 394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project field = dvmSlotToField(declaringClass, slot); 396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(field != NULL); 397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ArrayObject* arr = dvmGetFieldSignatureAnnotation(field); 399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmReleaseTrackedAlloc((Object*) arr, NULL); 400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_PTR(arr); 401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectconst DalvikNativeMethod dvm_java_lang_reflect_Field[] = { 404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "getFieldModifiers", "(Ljava/lang/Class;I)I", 405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_reflect_Field_getFieldModifiers }, 406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "getField", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZ)Ljava/lang/Object;", 407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_reflect_Field_getField }, 408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "getBField", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZI)B", 409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_reflect_Field_getPrimitiveField }, 410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "getCField", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZI)C", 411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_reflect_Field_getPrimitiveField }, 412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "getDField", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZI)D", 413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_reflect_Field_getPrimitiveField }, 414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "getFField", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZI)F", 415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_reflect_Field_getPrimitiveField }, 416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "getIField", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZI)I", 417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_reflect_Field_getPrimitiveField }, 418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "getJField", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZI)J", 419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_reflect_Field_getPrimitiveField }, 420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "getSField", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZI)S", 421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_reflect_Field_getPrimitiveField }, 422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "getZField", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZI)Z", 423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_reflect_Field_getPrimitiveField }, 424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "setField", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZLjava/lang/Object;)V", 425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_reflect_Field_setField }, 426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "setBField", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZIB)V", 427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_reflect_Field_setPrimitiveField }, 428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "setCField", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZIC)V", 429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_reflect_Field_setPrimitiveField }, 430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "setDField", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZID)V", 431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_reflect_Field_setPrimitiveField }, 432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "setFField", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZIF)V", 433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_reflect_Field_setPrimitiveField }, 434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "setIField", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZII)V", 435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_reflect_Field_setPrimitiveField }, 436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "setJField", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZIJ)V", 437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_reflect_Field_setPrimitiveField }, 438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "setSField", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZIS)V", 439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_reflect_Field_setPrimitiveField }, 440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "setZField", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZIZ)V", 441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_reflect_Field_setPrimitiveField }, 442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "getDeclaredAnnotations", "(Ljava/lang/Class;I)[Ljava/lang/annotation/Annotation;", 443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_reflect_Field_getDeclaredAnnotations }, 444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "getSignatureAnnotation", "(Ljava/lang/Class;I)[Ljava/lang/Object;", 445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_reflect_Field_getSignatureAnnotation }, 446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { NULL, NULL, NULL }, 447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}; 448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 449