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