1f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License.  You may obtain a copy of the License at
8f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * you may not use this file except in compliance with the License.
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * You may obtain a copy of the License at
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License.
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.lang.reflect;
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.lang.annotation.Annotation;
360843c022f443b5c4a8ea4d298c8b12147989ec92Jesse Wilsonimport java.util.Comparator;
377365de1056414750d0a7d1fdd26025fd247f0d04Jesse Wilsonimport org.apache.harmony.kernel.vm.StringUtils;
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.luni.lang.reflect.GenericSignatureParser;
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.luni.lang.reflect.Types;
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This class represents a field. Information about the field can be accessed,
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * and the field's value can be accessed dynamically.
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic final class Field extends AccessibleObject implements Member {
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
470843c022f443b5c4a8ea4d298c8b12147989ec92Jesse Wilson    /**
480843c022f443b5c4a8ea4d298c8b12147989ec92Jesse Wilson     * Orders fields by their name and declaring class.
490843c022f443b5c4a8ea4d298c8b12147989ec92Jesse Wilson     *
500843c022f443b5c4a8ea4d298c8b12147989ec92Jesse Wilson     * @hide
510843c022f443b5c4a8ea4d298c8b12147989ec92Jesse Wilson     */
520843c022f443b5c4a8ea4d298c8b12147989ec92Jesse Wilson    public static final Comparator<Field> ORDER_BY_NAME_AND_DECLARING_CLASS
530843c022f443b5c4a8ea4d298c8b12147989ec92Jesse Wilson            = new Comparator<Field>() {
540843c022f443b5c4a8ea4d298c8b12147989ec92Jesse Wilson        @Override public int compare(Field a, Field b) {
550843c022f443b5c4a8ea4d298c8b12147989ec92Jesse Wilson            int comparison = a.name.compareTo(b.name);
560843c022f443b5c4a8ea4d298c8b12147989ec92Jesse Wilson            if (comparison != 0) {
570843c022f443b5c4a8ea4d298c8b12147989ec92Jesse Wilson                return comparison;
580843c022f443b5c4a8ea4d298c8b12147989ec92Jesse Wilson            }
590843c022f443b5c4a8ea4d298c8b12147989ec92Jesse Wilson
600843c022f443b5c4a8ea4d298c8b12147989ec92Jesse Wilson            return a.getDeclaringClass().getName().compareTo(b.getDeclaringClass().getName());
610843c022f443b5c4a8ea4d298c8b12147989ec92Jesse Wilson        }
620843c022f443b5c4a8ea4d298c8b12147989ec92Jesse Wilson    };
630843c022f443b5c4a8ea4d298c8b12147989ec92Jesse Wilson
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private Class<?> declaringClass;
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private Class<?> type;
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private Type genericType;
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private volatile boolean genericTypesAreInitialized = false;
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private String name;
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private int slot;
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
7673fba5afced7560686badbc10dedf0d7211458b8Dan Bornstein    private static final char TYPE_BOOLEAN = 'Z';
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
7873fba5afced7560686badbc10dedf0d7211458b8Dan Bornstein    private static final char TYPE_BYTE = 'B';
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
8073fba5afced7560686badbc10dedf0d7211458b8Dan Bornstein    private static final char TYPE_CHAR = 'C';
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
8273fba5afced7560686badbc10dedf0d7211458b8Dan Bornstein    private static final char TYPE_SHORT = 'S';
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
8473fba5afced7560686badbc10dedf0d7211458b8Dan Bornstein    private static final char TYPE_INTEGER = 'I';
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
8673fba5afced7560686badbc10dedf0d7211458b8Dan Bornstein    private static final char TYPE_FLOAT = 'F';
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
8873fba5afced7560686badbc10dedf0d7211458b8Dan Bornstein    private static final char TYPE_LONG = 'J';
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
9073fba5afced7560686badbc10dedf0d7211458b8Dan Bornstein    private static final char TYPE_DOUBLE = 'D';
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Construct a clone of the given instance.
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param orig non-null; the original instance to clone
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /*package*/ Field(Field orig) {
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this(orig.declaringClass, orig.type, orig.name, orig.slot);
99f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Copy the accessible flag.
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (orig.flag) {
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            this.flag = true;
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private Field(Class<?> declaringClass, Class<?> type, String name, int slot) {
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.declaringClass = declaringClass;
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.type = type;
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.name = name;
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.slot = slot;
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private synchronized void initGenericType() {
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!genericTypesAreInitialized) {
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            String signatureAttribute = getSignatureAttribute();
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            GenericSignatureParser parser = new GenericSignatureParser(
117f3507d0976cb14ba59e0715f22f4c6b7c97cbae8Jesse Wilson                    declaringClass.getClassLoader());
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            parser.parseForField(this.declaringClass, signatureAttribute);
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            genericType = parser.fieldType;
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (genericType == null) {
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                genericType = getType();
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            genericTypesAreInitialized = true;
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** {@inheritDoc} */
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /* package */String getSignatureAttribute() {
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Object[] annotation = getSignatureAnnotation(declaringClass, slot);
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (annotation == null) {
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return StringUtils.combineStrings(annotation);
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Get the Signature annotation for this field. Returns null if not found.
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    native private Object[] getSignatureAnnotation(Class declaringClass, int slot);
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether or not this field is synthetic.
146f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if this field is synthetic, {@code false} otherwise
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isSynthetic() {
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int flags = getFieldModifiers(declaringClass, slot);
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (flags & Modifier.SYNTHETIC) != 0;
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the string representation of this field, including the field's
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * generic type.
157f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the string representation of this field
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String toGenericString() {
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        StringBuilder sb = new StringBuilder(80);
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // append modifiers if any
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int modifier = getModifiers();
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (modifier != 0) {
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            sb.append(Modifier.toString(modifier)).append(' ');
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // append generic type
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        appendGenericType(sb, getGenericType());
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sb.append(' ');
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // append full field name
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sb.append(getDeclaringClass().getName()).append('.').append(getName());
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return sb.toString();
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether or not this field is an enumeration constant.
177f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if this field is an enumeration constant, {@code
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         false} otherwise
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isEnumConstant() {
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int flags = getFieldModifiers(declaringClass, slot);
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (flags & Modifier.ENUM) != 0;
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the generic type of this field.
188f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the generic type
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws GenericSignatureFormatError
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the generic field signature is invalid
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws TypeNotPresentException
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the generic type points to a missing type
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws MalformedParameterizedTypeException
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the generic type points to a type that cannot be
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             instantiated for some reason
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Type getGenericType() {
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        initGenericType();
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return Types.getType(genericType);
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
203e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson    @Override public Annotation[] getDeclaredAnnotations() {
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getDeclaredAnnotations(declaringClass, slot);
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
206e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson    private static native Annotation[] getDeclaredAnnotations(Class declaringClass, int slot);
207e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson
208e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson    @Override public <A extends Annotation> A getAnnotation(Class<A> annotationType) {
209e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson        if (annotationType == null) {
210e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson            throw new NullPointerException("annotationType == null");
211e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson        }
212e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson        return getAnnotation(declaringClass, slot, annotationType);
213e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson    }
214e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson    private static native <A extends Annotation> A getAnnotation(
215e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson            Class<?> declaringClass, int slot, Class<A> annotationType);
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
217e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson    @Override public boolean isAnnotationPresent(Class<? extends Annotation> annotationType) {
218e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson        if (annotationType == null) {
219e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson            throw new NullPointerException("annotationType == null");
220e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson        }
221e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson        return isAnnotationPresent(declaringClass, slot, annotationType);
222e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson    }
223e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson    private static native boolean isAnnotationPresent(
224e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson            Class<?> declaringClass, int slot, Class<? extends Annotation> annotationType);
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether or not the specified {@code object} is equal to this
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * field. To be equal, the specified object must be an instance of
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code Field} with the same declaring class, type and name as this field.
230f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param object
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object to compare
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the specified object is equal to this method,
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code false} otherwise
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #hashCode
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean equals(Object object) {
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return object instanceof Field && toString().equals(object.toString());
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the value of the field in the specified object. This reproduces
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the effect of {@code object.fieldName}
2458da55422ed93013260c1536080b14661bfecfefbElliott Hughes     *
2468da55422ed93013260c1536080b14661bfecfefbElliott Hughes     * <p>If the type of this field is a primitive type, the field value is
2478da55422ed93013260c1536080b14661bfecfefbElliott Hughes     * automatically boxed.
2488da55422ed93013260c1536080b14661bfecfefbElliott Hughes     *
2498da55422ed93013260c1536080b14661bfecfefbElliott Hughes     * <p>If this field is static, the object argument is ignored.
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Otherwise, if the object is null, a NullPointerException is thrown. If
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the object is not an instance of the declaring class of the method, an
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * IllegalArgumentException is thrown.
2538da55422ed93013260c1536080b14661bfecfefbElliott Hughes     *
2548da55422ed93013260c1536080b14661bfecfefbElliott Hughes     * <p>If this Field object is enforcing access control (see AccessibleObject)
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * and this field is not accessible from the current context, an
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * IllegalAccessException is thrown.
257f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param object
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object to access
2608da55422ed93013260c1536080b14661bfecfefbElliott Hughes     * @return the field value, possibly boxed
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the object is {@code null} and the field is non-static
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the object is not compatible with the declaring class
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalAccessException
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this field is not accessible
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Object get(Object object) throws IllegalAccessException, IllegalArgumentException {
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getField(object, declaringClass, type, slot, flag);
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the value of the field in the specified object as a {@code
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * boolean}. This reproduces the effect of {@code object.fieldName}
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If this field is static, the object argument is ignored.
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Otherwise, if the object is {@code null}, a NullPointerException is
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * thrown. If the object is not an instance of the declaring class of the
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * method, an IllegalArgumentException is thrown.
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If this Field object is enforcing access control (see AccessibleObject)
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * and this field is not accessible from the current context, an
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * IllegalAccessException is thrown.
284f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param object
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object to access
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the field value
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the object is {@code null} and the field is non-static
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the object is not compatible with the declaring class
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalAccessException
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this field is not accessible
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean getBoolean(Object object) throws IllegalAccessException,
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            IllegalArgumentException {
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getZField(object, declaringClass, type, slot, flag, TYPE_BOOLEAN);
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the value of the field in the specified object as a {@code byte}.
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This reproduces the effect of {@code object.fieldName}
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If this field is static, the object argument is ignored.
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Otherwise, if the object is {@code null}, a NullPointerException is
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * thrown. If the object is not an instance of the declaring class of the
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * method, an IllegalArgumentException is thrown.
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If this Field object is enforcing access control (see AccessibleObject)
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * and this field is not accessible from the current context, an
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * IllegalAccessException is thrown.
312f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param object
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object to access
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the field value
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the object is {@code null} and the field is non-static
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the object is not compatible with the declaring class
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalAccessException
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this field is not accessible
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public byte getByte(Object object) throws IllegalAccessException, IllegalArgumentException {
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getBField(object, declaringClass, type, slot, flag, TYPE_BYTE);
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the value of the field in the specified object as a {@code char}.
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This reproduces the effect of {@code object.fieldName}
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If this field is static, the object argument is ignored.
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Otherwise, if the object is {@code null}, a NullPointerException is
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * thrown. If the object is not an instance of the declaring class of the
334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * method, an IllegalArgumentException is thrown.
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If this Field object is enforcing access control (see AccessibleObject)
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * and this field is not accessible from the current context, an
338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * IllegalAccessException is thrown.
339f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param object
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object to access
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the field value
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the object is {@code null} and the field is non-static
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the object is not compatible with the declaring class
347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalAccessException
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this field is not accessible
349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public char getChar(Object object) throws IllegalAccessException, IllegalArgumentException {
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getCField(object, declaringClass, type, slot, flag, TYPE_CHAR);
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the class that declares this field.
356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the declaring class
358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Class<?> getDeclaringClass() {
360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return declaringClass;
361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the value of the field in the specified object as a {@code
365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * double}. This reproduces the effect of {@code object.fieldName}
366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If this field is static, the object argument is ignored.
368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Otherwise, if the object is {@code null}, a NullPointerException is
369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * thrown. If the object is not an instance of the declaring class of the
370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * method, an IllegalArgumentException is thrown.
371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If this Field object is enforcing access control (see AccessibleObject)
373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * and this field is not accessible from the current context, an
374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * IllegalAccessException is thrown.
375f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param object
377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object to access
378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the field value
379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the object is {@code null} and the field is non-static
381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the object is not compatible with the declaring class
383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalAccessException
384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this field is not accessible
385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public double getDouble(Object object) throws IllegalAccessException, IllegalArgumentException {
387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getDField(object, declaringClass, type, slot, flag, TYPE_DOUBLE);
388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the value of the field in the specified object as a {@code float}
392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * . This reproduces the effect of {@code object.fieldName}
393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If this field is static, the object argument is ignored.
395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Otherwise, if the object is {@code null}, a NullPointerException is
396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * thrown. If the object is not an instance of the declaring class of the
397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * method, an IllegalArgumentException is thrown.
398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If this Field object is enforcing access control (see AccessibleObject)
400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * and this field is not accessible from the current context, an
401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * IllegalAccessException is thrown.
402f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param object
404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object to access
405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the field value
406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the object is {@code null} and the field is non-static
408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the object is not compatible with the declaring class
410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalAccessException
411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this field is not accessible
412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public float getFloat(Object object) throws IllegalAccessException, IllegalArgumentException {
414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getFField(object, declaringClass, type, slot, flag, TYPE_FLOAT);
415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the value of the field in the specified object as an {@code int}.
419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This reproduces the effect of {@code object.fieldName}
420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If this field is static, the object argument is ignored.
422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Otherwise, if the object is {@code null}, a NullPointerException is
423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * thrown. If the object is not an instance of the declaring class of the
424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * method, an IllegalArgumentException is thrown.
425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If this Field object is enforcing access control (see AccessibleObject)
427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * and this field is not accessible from the current context, an
428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * IllegalAccessException is thrown.
429f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param object
431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object to access
432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the field value
433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the object is {@code null} and the field is non-static
435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the object is not compatible with the declaring class
437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalAccessException
438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this field is not accessible
439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getInt(Object object) throws IllegalAccessException, IllegalArgumentException {
441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getIField(object, declaringClass, type, slot, flag, TYPE_INTEGER);
442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the value of the field in the specified object as a {@code long}.
446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This reproduces the effect of {@code object.fieldName}
447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If this field is static, the object argument is ignored.
449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Otherwise, if the object is {@code null}, a NullPointerException is
450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * thrown. If the object is not an instance of the declaring class of the
451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * method, an IllegalArgumentException is thrown.
452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If this Field object is enforcing access control (see AccessibleObject)
454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * and this field is not accessible from the current context, an
455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * IllegalAccessException is thrown.
456f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param object
458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object to access
459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the field value
460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the object is {@code null} and the field is non-static
462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the object is not compatible with the declaring class
464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalAccessException
465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this field is not accessible
466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public long getLong(Object object) throws IllegalAccessException, IllegalArgumentException {
468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getJField(object, declaringClass, type, slot, flag, TYPE_LONG);
469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the modifiers for this field. The {@link Modifier} class should
473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * be used to decode the result.
474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the modifiers for this field
476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see Modifier
477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getModifiers() {
479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getFieldModifiers(declaringClass, slot);
480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private native int getFieldModifiers(Class<?> declaringClass, int slot);
483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the name of this field.
486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the name of this field
488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getName() {
490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return name;
491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the value of the field in the specified object as a {@code short}
495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * . This reproduces the effect of {@code object.fieldName}
496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If this field is static, the object argument is ignored.
498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Otherwise, if the object is {@code null}, a NullPointerException is
499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * thrown. If the object is not an instance of the declaring class of the
500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * method, an IllegalArgumentException is thrown.
501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If this Field object is enforcing access control (see AccessibleObject)
503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * and this field is not accessible from the current context, an
504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * IllegalAccessException is thrown.
505f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param object
507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object to access
508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the field value
509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the object is {@code null} and the field is non-static
511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the object is not compatible with the declaring class
513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalAccessException
514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this field is not accessible
515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public short getShort(Object object) throws IllegalAccessException, IllegalArgumentException {
517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getSField(object, declaringClass, type, slot, flag, TYPE_SHORT);
518adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
519adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the constructor's signature in non-printable form. This is called
522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * (only) from IO native code and needed for deriving the serialVersionUID
523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * of the class
524f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the constructor's signature.
526adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
527adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @SuppressWarnings("unused")
528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private String getSignature() {
529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getSignature(type);
530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
531adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Return the {@link Class} associated with the type of this field.
534f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the type of this field
536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Class<?> getType() {
538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return type;
539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
540adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
541adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns an integer hash code for this field. Objects which are equal
543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * return the same value for this method.
544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The hash code for a Field is the exclusive-or combination of the hash
546adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * code of the field's name and the hash code of the name of its declaring
547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * class.
548f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
549adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the hash code for this field
550adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #equals
551adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
552adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
553adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int hashCode() {
554adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return name.hashCode() ^ getDeclaringClass().getName().hashCode();
555adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
556adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
557adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
558adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the value of the field in the specified object to the value. This
559adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * reproduces the effect of {@code object.fieldName = value}
5608da55422ed93013260c1536080b14661bfecfefbElliott Hughes     *
5618da55422ed93013260c1536080b14661bfecfefbElliott Hughes     * <p>If this field is static, the object argument is ignored.
562adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Otherwise, if the object is {@code null}, a NullPointerException is
563adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * thrown. If the object is not an instance of the declaring class of the
564adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * method, an IllegalArgumentException is thrown.
5658da55422ed93013260c1536080b14661bfecfefbElliott Hughes     *
5668da55422ed93013260c1536080b14661bfecfefbElliott Hughes     * <p>If this Field object is enforcing access control (see AccessibleObject)
567adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * and this field is not accessible from the current context, an
568adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * IllegalAccessException is thrown.
5698da55422ed93013260c1536080b14661bfecfefbElliott Hughes     *
5708da55422ed93013260c1536080b14661bfecfefbElliott Hughes     * <p>If the field type is a primitive type, the value is automatically
5718da55422ed93013260c1536080b14661bfecfefbElliott Hughes     * unboxed. If the unboxing fails, an IllegalArgumentException is thrown. If
572adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the value cannot be converted to the field type via a widening
573adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * conversion, an IllegalArgumentException is thrown.
574f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
575adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param object
576adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object to access
577adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
578adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the new value
579adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
580adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the object is {@code null} and the field is non-static
581adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
582adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the object is not compatible with the declaring class
583adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalAccessException
584adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this field is not accessible
585adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
586adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void set(Object object, Object value) throws IllegalAccessException,
587adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            IllegalArgumentException {
588adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        setField(object, declaringClass, type, slot, flag, value);
589adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
590adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
591adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
592adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the value of the field in the specified object to the {@code
593adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * boolean} value. This reproduces the effect of {@code object.fieldName =
594adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * value}
595adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
596adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If this field is static, the object argument is ignored.
597adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Otherwise, if the object is {@code null}, a NullPointerException is
598adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * thrown. If the object is not an instance of the declaring class of the
599adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * method, an IllegalArgumentException is thrown.
600adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
601adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If this Field object is enforcing access control (see AccessibleObject)
602adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * and this field is not accessible from the current context, an
603adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * IllegalAccessException is thrown.
604adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
605adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If the value cannot be converted to the field type via a widening
606adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * conversion, an IllegalArgumentException is thrown.
607f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
608adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param object
609adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object to access
610adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
611adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the new value
612adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
613adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the object is {@code null} and the field is non-static
614adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
615adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the object is not compatible with the declaring class
616adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalAccessException
617adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this field is not accessible
618adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
619adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setBoolean(Object object, boolean value) throws IllegalAccessException,
620adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            IllegalArgumentException {
621adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        setZField(object, declaringClass, type, slot, flag, TYPE_BOOLEAN, value);
622adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
623adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
624adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
625adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the value of the field in the specified object to the {@code byte}
626adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * value. This reproduces the effect of {@code object.fieldName = value}
627adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
628adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If this field is static, the object argument is ignored.
629adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Otherwise, if the object is {@code null}, a NullPointerException is
630adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * thrown. If the object is not an instance of the declaring class of the
631adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * method, an IllegalArgumentException is thrown.
632adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
633adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If this Field object is enforcing access control (see AccessibleObject)
634adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * and this field is not accessible from the current context, an
635adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * IllegalAccessException is thrown.
636adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
637adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If the value cannot be converted to the field type via a widening
638adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * conversion, an IllegalArgumentException is thrown.
639f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
640adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param object
641adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object to access
642adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
643adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the new value
644adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
645adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the object is {@code null} and the field is non-static
646adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
647adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the object is not compatible with the declaring class
648adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalAccessException
649adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this field is not accessible
650adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
651adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setByte(Object object, byte value) throws IllegalAccessException,
652adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            IllegalArgumentException {
653adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        setBField(object, declaringClass, type, slot, flag, TYPE_BYTE, value);
654adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
655adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
656adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
657adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the value of the field in the specified object to the {@code char}
658adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * value. This reproduces the effect of {@code object.fieldName = value}
659adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
660adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If this field is static, the object argument is ignored.
661adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Otherwise, if the object is {@code null}, a NullPointerException is
662adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * thrown. If the object is not an instance of the declaring class of the
663adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * method, an IllegalArgumentException is thrown.
664adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
665adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If this Field object is enforcing access control (see AccessibleObject)
666adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * and this field is not accessible from the current context, an
667adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * IllegalAccessException is thrown.
668adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
669adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If the value cannot be converted to the field type via a widening
670adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * conversion, an IllegalArgumentException is thrown.
671f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
672adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param object
673adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object to access
674adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
675adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the new value
676adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
677adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the object is {@code null} and the field is non-static
678adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
679adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the object is not compatible with the declaring class
680adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalAccessException
681adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this field is not accessible
682adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
683adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setChar(Object object, char value) throws IllegalAccessException,
684adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            IllegalArgumentException {
685adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        setCField(object, declaringClass, type, slot, flag, TYPE_CHAR, value);
686adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
687adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
688adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
689adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the value of the field in the specified object to the {@code double}
690adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * value. This reproduces the effect of {@code object.fieldName = value}
691adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
692adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If this field is static, the object argument is ignored.
693adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Otherwise, if the object is {@code null}, a NullPointerException is
694adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * thrown. If the object is not an instance of the declaring class of the
695adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * method, an IllegalArgumentException is thrown.
696adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
697adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If this Field object is enforcing access control (see AccessibleObject)
698adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * and this field is not accessible from the current context, an
699adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * IllegalAccessException is thrown.
700adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
701adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If the value cannot be converted to the field type via a widening
702adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * conversion, an IllegalArgumentException is thrown.
703f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
704adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param object
705adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object to access
706adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
707adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the new value
708adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
709adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the object is {@code null} and the field is non-static
710adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
711adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the object is not compatible with the declaring class
712adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalAccessException
713adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this field is not accessible
714adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
715adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setDouble(Object object, double value) throws IllegalAccessException,
716adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            IllegalArgumentException {
717adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        setDField(object, declaringClass, type, slot, flag, TYPE_DOUBLE, value);
718adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
719adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
720adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
721adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the value of the field in the specified object to the {@code float}
722adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * value. This reproduces the effect of {@code object.fieldName = value}
723adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
724adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If this field is static, the object argument is ignored.
725adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Otherwise, if the object is {@code null}, a NullPointerException is
726adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * thrown. If the object is not an instance of the declaring class of the
727adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * method, an IllegalArgumentException is thrown.
728adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
729adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If this Field object is enforcing access control (see AccessibleObject)
730adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * and this field is not accessible from the current context, an
731adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * IllegalAccessException is thrown.
732adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
733adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If the value cannot be converted to the field type via a widening
734adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * conversion, an IllegalArgumentException is thrown.
735f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
736adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param object
737adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object to access
738adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
739adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the new value
740adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
741adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the object is {@code null} and the field is non-static
742adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
743adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the object is not compatible with the declaring class
744adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalAccessException
745adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this field is not accessible
746adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
747adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setFloat(Object object, float value) throws IllegalAccessException,
748adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            IllegalArgumentException {
749adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        setFField(object, declaringClass, type, slot, flag, TYPE_FLOAT, value);
750adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
751adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
752adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
753adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Set the value of the field in the specified object to the {@code int}
754adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * value. This reproduces the effect of {@code object.fieldName = value}
755adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
756adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If this field is static, the object argument is ignored.
757adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Otherwise, if the object is {@code null}, a NullPointerException is
758adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * thrown. If the object is not an instance of the declaring class of the
759adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * method, an IllegalArgumentException is thrown.
760adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
761adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If this Field object is enforcing access control (see AccessibleObject)
762adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * and this field is not accessible from the current context, an
763adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * IllegalAccessException is thrown.
764adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
765adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If the value cannot be converted to the field type via a widening
766adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * conversion, an IllegalArgumentException is thrown.
767f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
768adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param object
769adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object to access
770adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
771adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the new value
772adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
773adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the object is {@code null} and the field is non-static
774adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
775adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the object is not compatible with the declaring class
776adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalAccessException
777adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this field is not accessible
778adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
779adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setInt(Object object, int value) throws IllegalAccessException,
780adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            IllegalArgumentException {
781adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        setIField(object, declaringClass, type, slot, flag, TYPE_INTEGER, value);
782adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
783adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
784adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
785adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the value of the field in the specified object to the {@code long}
786adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * value. This reproduces the effect of {@code object.fieldName = value}
787adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
788adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If this field is static, the object argument is ignored.
789adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Otherwise, if the object is {@code null}, a NullPointerException is
790adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * thrown. If the object is not an instance of the declaring class of the
791adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * method, an IllegalArgumentException is thrown.
792adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
793adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If this Field object is enforcing access control (see AccessibleObject)
794adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * and this field is not accessible from the current context, an
795adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * IllegalAccessException is thrown.
796adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
797adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If the value cannot be converted to the field type via a widening
798adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * conversion, an IllegalArgumentException is thrown.
799f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
800adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param object
801adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object to access
802adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
803adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the new value
804adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
805adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the object is {@code null} and the field is non-static
806adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
807adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the object is not compatible with the declaring class
808adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalAccessException
809adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this field is not accessible
810adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
811adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setLong(Object object, long value) throws IllegalAccessException,
812adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            IllegalArgumentException {
813adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        setJField(object, declaringClass, type, slot, flag, TYPE_LONG, value);
814adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
815adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
816adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
817adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the value of the field in the specified object to the {@code short}
818adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * value. This reproduces the effect of {@code object.fieldName = value}
819adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
820adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If this field is static, the object argument is ignored.
821adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Otherwise, if the object is {@code null}, a NullPointerException is
822adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * thrown. If the object is not an instance of the declaring class of the
823adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * method, an IllegalArgumentException is thrown.
824adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
825adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If this Field object is enforcing access control (see AccessibleObject)
826adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * and this field is not accessible from the current context, an
827adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * IllegalAccessException is thrown.
828adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
829adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If the value cannot be converted to the field type via a widening
830adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * conversion, an IllegalArgumentException is thrown.
831f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
832adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param object
833adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object to access
834adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
835adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the new value
836adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
837adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the object is {@code null} and the field is non-static
838adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
839adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the object is not compatible with the declaring class
840adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalAccessException
841adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this field is not accessible
842adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
843adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setShort(Object object, short value) throws IllegalAccessException,
844adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            IllegalArgumentException {
845adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        setSField(object, declaringClass, type, slot, flag, TYPE_SHORT, value);
846adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
847adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
848adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
849adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a string containing a concise, human-readable description of this
850adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * field.
851adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
852adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The format of the string is:
853adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <ol>
854adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *   <li>modifiers (if any)
855adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *   <li>type
856adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *   <li>declaring class name
857adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *   <li>'.'
858adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *   <li>field name
859adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * </ol>
860adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
861adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * For example: {@code public static java.io.InputStream
862adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * java.lang.System.in}
863f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
864adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a printable representation for this field
865adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
866adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
867adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String toString() {
8687f0c06f737b6f1f6b3a5bb30111f95dd0ca586a2Brian Carlstrom        StringBuilder result = new StringBuilder(Modifier.toString(getModifiers()));
8697f0c06f737b6f1f6b3a5bb30111f95dd0ca586a2Brian Carlstrom        if (result.length() != 0) {
870adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            result.append(' ');
8717f0c06f737b6f1f6b3a5bb30111f95dd0ca586a2Brian Carlstrom        }
872a0ee76b0850774edeb0c67204070b89d117573bcJesse Wilson        appendTypeName(result, type);
873adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        result.append(' ');
874a0ee76b0850774edeb0c67204070b89d117573bcJesse Wilson        appendTypeName(result, declaringClass);
875adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        result.append('.');
876adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        result.append(name);
877adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return result.toString();
878adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
879adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
880adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private native Object getField(Object o, Class<?> declaringClass, Class<?> type, int slot,
881adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            boolean noAccessCheck) throws IllegalAccessException;
882adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
883adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private native double getDField(Object o, Class<?> declaringClass, Class<?> type, int slot,
88473fba5afced7560686badbc10dedf0d7211458b8Dan Bornstein            boolean noAccessCheck, char descriptor) throws IllegalAccessException;
885adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
886adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private native int getIField(Object o, Class<?> declaringClass, Class<?> type, int slot,
88773fba5afced7560686badbc10dedf0d7211458b8Dan Bornstein            boolean noAccessCheck, char descriptor) throws IllegalAccessException;
888adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
889adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private native long getJField(Object o, Class<?> declaringClass, Class<?> type, int slot,
89073fba5afced7560686badbc10dedf0d7211458b8Dan Bornstein            boolean noAccessCheck, char descriptor) throws IllegalAccessException;
891adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
892adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private native boolean getZField(Object o, Class<?> declaringClass, Class<?> type, int slot,
89373fba5afced7560686badbc10dedf0d7211458b8Dan Bornstein            boolean noAccessCheck, char descriptor) throws IllegalAccessException;
894adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
895adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private native float getFField(Object o, Class<?> declaringClass, Class<?> type, int slot,
89673fba5afced7560686badbc10dedf0d7211458b8Dan Bornstein            boolean noAccessCheck, char descriptor) throws IllegalAccessException;
897adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
898adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private native char getCField(Object o, Class<?> declaringClass, Class<?> type, int slot,
89973fba5afced7560686badbc10dedf0d7211458b8Dan Bornstein            boolean noAccessCheck, char descriptor) throws IllegalAccessException;
900adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
901adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private native short getSField(Object o, Class<?> declaringClass, Class<?> type, int slot,
90273fba5afced7560686badbc10dedf0d7211458b8Dan Bornstein            boolean noAccessCheck, char descriptor) throws IllegalAccessException;
903adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
904adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private native byte getBField(Object o, Class<?> declaringClass, Class<?> type, int slot,
90573fba5afced7560686badbc10dedf0d7211458b8Dan Bornstein            boolean noAccessCheck, char descriptor) throws IllegalAccessException;
906adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
907adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private native void setField(Object o, Class<?> declaringClass, Class<?> type, int slot,
908adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            boolean noAccessCheck, Object value) throws IllegalAccessException;
909adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
910adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private native void setDField(Object o, Class<?> declaringClass, Class<?> type, int slot,
91173fba5afced7560686badbc10dedf0d7211458b8Dan Bornstein            boolean noAccessCheck, char descriptor, double v) throws IllegalAccessException;
912adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
913adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private native void setIField(Object o, Class<?> declaringClass, Class<?> type, int slot,
91473fba5afced7560686badbc10dedf0d7211458b8Dan Bornstein            boolean noAccessCheck, char descriptor, int i) throws IllegalAccessException;
915adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
916adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private native void setJField(Object o, Class<?> declaringClass, Class<?> type, int slot,
91773fba5afced7560686badbc10dedf0d7211458b8Dan Bornstein            boolean noAccessCheck, char descriptor, long j) throws IllegalAccessException;
918adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
919adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private native void setZField(Object o, Class<?> declaringClass, Class<?> type, int slot,
92073fba5afced7560686badbc10dedf0d7211458b8Dan Bornstein            boolean noAccessCheck, char descriptor, boolean z) throws IllegalAccessException;
921adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
922adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private native void setFField(Object o, Class<?> declaringClass, Class<?> type, int slot,
92373fba5afced7560686badbc10dedf0d7211458b8Dan Bornstein            boolean noAccessCheck, char descriptor, float f) throws IllegalAccessException;
924adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
925adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private native void setCField(Object o, Class<?> declaringClass, Class<?> type, int slot,
92673fba5afced7560686badbc10dedf0d7211458b8Dan Bornstein            boolean noAccessCheck, char descriptor, char c) throws IllegalAccessException;
927adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
928adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private native void setSField(Object o, Class<?> declaringClass, Class<?> type, int slot,
92973fba5afced7560686badbc10dedf0d7211458b8Dan Bornstein            boolean noAccessCheck, char descriptor, short s) throws IllegalAccessException;
930adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
931adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private native void setBField(Object o, Class<?> declaringClass, Class<?> type, int slot,
93273fba5afced7560686badbc10dedf0d7211458b8Dan Bornstein            boolean noAccessCheck, char descriptor, byte b) throws IllegalAccessException;
933adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
934adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
935