Home | History | Annotate | Download | only in reflect
      1 /*
      2  * Copyright (C) 2014 The Android Open Source Project
      3  * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
      4  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      5  *
      6  * This code is free software; you can redistribute it and/or modify it
      7  * under the terms of the GNU General Public License version 2 only, as
      8  * published by the Free Software Foundation.  Oracle designates this
      9  * particular file as subject to the "Classpath" exception as provided
     10  * by Oracle in the LICENSE file that accompanied this code.
     11  *
     12  * This code is distributed in the hope that it will be useful, but WITHOUT
     13  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
     14  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     15  * version 2 for more details (a copy is included in the LICENSE file that
     16  * accompanied this code).
     17  *
     18  * You should have received a copy of the GNU General Public License version
     19  * 2 along with this work; if not, write to the Free Software Foundation,
     20  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
     21  *
     22  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
     23  * or visit www.oracle.com if you need additional information or have any
     24  * questions.
     25  */
     26 
     27 package java.lang.reflect;
     28 
     29 import dalvik.annotation.optimization.FastNative;
     30 
     31 import java.lang.annotation.Annotation;
     32 import java.util.Objects;
     33 import libcore.reflect.AnnotatedElements;
     34 import libcore.reflect.GenericSignatureParser;
     35 
     36 
     37 /**
     38  * A {@code Field} provides information about, and dynamic access to, a
     39  * single field of a class or an interface.  The reflected field may
     40  * be a class (static) field or an instance field.
     41  *
     42  * <p>A {@code Field} permits widening conversions to occur during a get or
     43  * set access operation, but throws an {@code IllegalArgumentException} if a
     44  * narrowing conversion would occur.
     45  *
     46  * @see Member
     47  * @see java.lang.Class
     48  * @see java.lang.Class#getFields()
     49  * @see java.lang.Class#getField(String)
     50  * @see java.lang.Class#getDeclaredFields()
     51  * @see java.lang.Class#getDeclaredField(String)
     52  *
     53  * @author Kenneth Russell
     54  * @author Nakul Saraiya
     55  */
     56 public final
     57 class Field extends AccessibleObject implements Member {
     58 
     59     private int accessFlags;
     60     private Class<?> declaringClass;
     61     private int dexFieldIndex;
     62     private int offset;
     63     private Class<?> type;
     64 
     65     private Field() {
     66     }
     67 
     68     /**
     69      * Returns the {@code Class} object representing the class or interface
     70      * that declares the field represented by this {@code Field} object.
     71      */
     72     public Class<?> getDeclaringClass() {
     73         return declaringClass;
     74     }
     75 
     76     /**
     77      * Returns the name of the field represented by this {@code Field} object.
     78      */
     79     public String getName() {
     80         if (dexFieldIndex == -1) {
     81             // Proxy classes have 1 synthesized static field with no valid dex index.
     82             if (!declaringClass.isProxy()) {
     83                 throw new AssertionError();
     84             }
     85             return "throws";
     86         }
     87 
     88         return getNameInternal();
     89     }
     90 
     91     @FastNative
     92     private native String getNameInternal();
     93 
     94     /**
     95      * Returns the Java language modifiers for the field represented
     96      * by this {@code Field} object, as an integer. The {@code Modifier} class should
     97      * be used to decode the modifiers.
     98      *
     99      * @see Modifier
    100      */
    101     public int getModifiers() {
    102         return accessFlags & 0xffff;  // mask out bits not used by Java
    103     }
    104 
    105     /**
    106      * Returns {@code true} if this field represents an element of
    107      * an enumerated type; returns {@code false} otherwise.
    108      *
    109      * @return {@code true} if and only if this field represents an element of
    110      * an enumerated type.
    111      * @since 1.5
    112      */
    113     public boolean isEnumConstant() {
    114         return (getModifiers() & Modifier.ENUM) != 0;
    115     }
    116 
    117     /**
    118      * Returns {@code true} if this field is a synthetic
    119      * field; returns {@code false} otherwise.
    120      *
    121      * @return true if and only if this field is a synthetic
    122      * field as defined by the Java Language Specification.
    123      * @since 1.5
    124      */
    125     public boolean isSynthetic() {
    126         return Modifier.isSynthetic(getModifiers());
    127     }
    128 
    129     /**
    130      * Returns a {@code Class} object that identifies the
    131      * declared type for the field represented by this
    132      * {@code Field} object.
    133      *
    134      * @return a {@code Class} object identifying the declared
    135      * type of the field represented by this object
    136      */
    137     public Class<?> getType() {
    138         return type;
    139     }
    140 
    141     /**
    142      * Returns a {@code Type} object that represents the declared type for
    143      * the field represented by this {@code Field} object.
    144      *
    145      * <p>If the {@code Type} is a parameterized type, the
    146      * {@code Type} object returned must accurately reflect the
    147      * actual type parameters used in the source code.
    148      *
    149      * <p>If the type of the underlying field is a type variable or a
    150      * parameterized type, it is created. Otherwise, it is resolved.
    151      *
    152      * @return a {@code Type} object that represents the declared type for
    153      *     the field represented by this {@code Field} object
    154      * @throws GenericSignatureFormatError if the generic field
    155      *     signature does not conform to the format specified in
    156      *     <cite>The Java&trade; Virtual Machine Specification</cite>
    157      * @throws TypeNotPresentException if the generic type
    158      *     signature of the underlying field refers to a non-existent
    159      *     type declaration
    160      * @throws MalformedParameterizedTypeException if the generic
    161      *     signature of the underlying field refers to a parameterized type
    162      *     that cannot be instantiated for any reason
    163      * @since 1.5
    164      */
    165     public Type getGenericType() {
    166         String signatureAttribute = getSignatureAttribute();
    167         ClassLoader cl = declaringClass.getClassLoader();
    168         GenericSignatureParser parser = new GenericSignatureParser(cl);
    169         parser.parseForField(declaringClass, signatureAttribute);
    170         Type genericType = parser.fieldType;
    171         if (genericType == null) {
    172             genericType = getType();
    173         }
    174         return genericType;
    175     }
    176 
    177     private String getSignatureAttribute() {
    178         String[] annotation = getSignatureAnnotation();
    179         if (annotation == null) {
    180             return null;
    181         }
    182         StringBuilder result = new StringBuilder();
    183         for (String s : annotation) {
    184             result.append(s);
    185         }
    186         return result.toString();
    187     }
    188     @FastNative
    189     private native String[] getSignatureAnnotation();
    190 
    191 
    192     /**
    193      * Compares this {@code Field} against the specified object.  Returns
    194      * true if the objects are the same.  Two {@code Field} objects are the same if
    195      * they were declared by the same class and have the same name
    196      * and type.
    197      */
    198     public boolean equals(Object obj) {
    199         if (obj != null && obj instanceof Field) {
    200             Field other = (Field)obj;
    201             return (getDeclaringClass() == other.getDeclaringClass())
    202                 && (getName() == other.getName())
    203                 && (getType() == other.getType());
    204         }
    205         return false;
    206     }
    207 
    208     /**
    209      * Returns a hashcode for this {@code Field}.  This is computed as the
    210      * exclusive-or of the hashcodes for the underlying field's
    211      * declaring class name and its name.
    212      */
    213     public int hashCode() {
    214         return getDeclaringClass().getName().hashCode() ^ getName().hashCode();
    215     }
    216 
    217     /**
    218      * Returns a string describing this {@code Field}.  The format is
    219      * the access modifiers for the field, if any, followed
    220      * by the field type, followed by a space, followed by
    221      * the fully-qualified name of the class declaring the field,
    222      * followed by a period, followed by the name of the field.
    223      * For example:
    224      * <pre>
    225      *    public static final int java.lang.Thread.MIN_PRIORITY
    226      *    private int java.io.FileDescriptor.fd
    227      * </pre>
    228      *
    229      * <p>The modifiers are placed in canonical order as specified by
    230      * "The Java Language Specification".  This is {@code public},
    231      * {@code protected} or {@code private} first, and then other
    232      * modifiers in the following order: {@code static}, {@code final},
    233      * {@code transient}, {@code volatile}.
    234      *
    235      * @return a string describing this {@code Field}
    236      * @jls 8.3.1 Field Modifiers
    237      */
    238     public String toString() {
    239         int mod = getModifiers();
    240         return (((mod == 0) ? "" : (Modifier.toString(mod) + " "))
    241             + getType().getTypeName() + " "
    242             + getDeclaringClass().getTypeName() + "."
    243             + getName());
    244     }
    245 
    246     /**
    247      * Returns a string describing this {@code Field}, including
    248      * its generic type.  The format is the access modifiers for the
    249      * field, if any, followed by the generic field type, followed by
    250      * a space, followed by the fully-qualified name of the class
    251      * declaring the field, followed by a period, followed by the name
    252      * of the field.
    253      *
    254      * <p>The modifiers are placed in canonical order as specified by
    255      * "The Java Language Specification".  This is {@code public},
    256      * {@code protected} or {@code private} first, and then other
    257      * modifiers in the following order: {@code static}, {@code final},
    258      * {@code transient}, {@code volatile}.
    259      *
    260      * @return a string describing this {@code Field}, including
    261      * its generic type
    262      *
    263      * @since 1.5
    264      * @jls 8.3.1 Field Modifiers
    265      */
    266     public String toGenericString() {
    267         int mod = getModifiers();
    268         Type fieldType = getGenericType();
    269         return (((mod == 0) ? "" : (Modifier.toString(mod) + " "))
    270             + fieldType.getTypeName() + " "
    271             + getDeclaringClass().getTypeName() + "."
    272             + getName());
    273     }
    274 
    275     /**
    276      * Returns the value of the field represented by this {@code Field}, on
    277      * the specified object. The value is automatically wrapped in an
    278      * object if it has a primitive type.
    279      *
    280      * <p>The underlying field's value is obtained as follows:
    281      *
    282      * <p>If the underlying field is a static field, the {@code obj} argument
    283      * is ignored; it may be null.
    284      *
    285      * <p>Otherwise, the underlying field is an instance field.  If the
    286      * specified {@code obj} argument is null, the method throws a
    287      * {@code NullPointerException}. If the specified object is not an
    288      * instance of the class or interface declaring the underlying
    289      * field, the method throws an {@code IllegalArgumentException}.
    290      *
    291      * <p>If this {@code Field} object is enforcing Java language access control, and
    292      * the underlying field is inaccessible, the method throws an
    293      * {@code IllegalAccessException}.
    294      * If the underlying field is static, the class that declared the
    295      * field is initialized if it has not already been initialized.
    296      *
    297      * <p>Otherwise, the value is retrieved from the underlying instance
    298      * or static field.  If the field has a primitive type, the value
    299      * is wrapped in an object before being returned, otherwise it is
    300      * returned as is.
    301      *
    302      * <p>If the field is hidden in the type of {@code obj},
    303      * the field's value is obtained according to the preceding rules.
    304      *
    305      * @param obj object from which the represented field's value is
    306      * to be extracted
    307      * @return the value of the represented field in object
    308      * {@code obj}; primitive values are wrapped in an appropriate
    309      * object before being returned
    310      *
    311      * @exception IllegalAccessException    if this {@code Field} object
    312      *              is enforcing Java language access control and the underlying
    313      *              field is inaccessible.
    314      * @exception IllegalArgumentException  if the specified object is not an
    315      *              instance of the class or interface declaring the underlying
    316      *              field (or a subclass or implementor thereof).
    317      * @exception NullPointerException      if the specified object is null
    318      *              and the field is an instance field.
    319      * @exception ExceptionInInitializerError if the initialization provoked
    320      *              by this method fails.
    321      */
    322     @FastNative
    323     public native Object get(Object obj)
    324         throws IllegalArgumentException, IllegalAccessException;
    325 
    326     /**
    327      * Gets the value of a static or instance {@code boolean} field.
    328      *
    329      * @param obj the object to extract the {@code boolean} value
    330      * from
    331      * @return the value of the {@code boolean} field
    332      *
    333      * @exception IllegalAccessException    if this {@code Field} object
    334      *              is enforcing Java language access control and the underlying
    335      *              field is inaccessible.
    336      * @exception IllegalArgumentException  if the specified object is not
    337      *              an instance of the class or interface declaring the
    338      *              underlying field (or a subclass or implementor
    339      *              thereof), or if the field value cannot be
    340      *              converted to the type {@code boolean} by a
    341      *              widening conversion.
    342      * @exception NullPointerException      if the specified object is null
    343      *              and the field is an instance field.
    344      * @exception ExceptionInInitializerError if the initialization provoked
    345      *              by this method fails.
    346      * @see       Field#get
    347      */
    348     @FastNative
    349     public native boolean getBoolean(Object obj)
    350         throws IllegalArgumentException, IllegalAccessException;
    351 
    352     /**
    353      * Gets the value of a static or instance {@code byte} field.
    354      *
    355      * @param obj the object to extract the {@code byte} value
    356      * from
    357      * @return the value of the {@code byte} field
    358      *
    359      * @exception IllegalAccessException    if this {@code Field} object
    360      *              is enforcing Java language access control and the underlying
    361      *              field is inaccessible.
    362      * @exception IllegalArgumentException  if the specified object is not
    363      *              an instance of the class or interface declaring the
    364      *              underlying field (or a subclass or implementor
    365      *              thereof), or if the field value cannot be
    366      *              converted to the type {@code byte} by a
    367      *              widening conversion.
    368      * @exception NullPointerException      if the specified object is null
    369      *              and the field is an instance field.
    370      * @exception ExceptionInInitializerError if the initialization provoked
    371      *              by this method fails.
    372      * @see       Field#get
    373      */
    374     @FastNative
    375     public native byte getByte(Object obj)
    376         throws IllegalArgumentException, IllegalAccessException;
    377 
    378     /**
    379      * Gets the value of a static or instance field of type
    380      * {@code char} or of another primitive type convertible to
    381      * type {@code char} via a widening conversion.
    382      *
    383      * @param obj the object to extract the {@code char} value
    384      * from
    385      * @return the value of the field converted to type {@code char}
    386      *
    387      * @exception IllegalAccessException    if this {@code Field} object
    388      *              is enforcing Java language access control and the underlying
    389      *              field is inaccessible.
    390      * @exception IllegalArgumentException  if the specified object is not
    391      *              an instance of the class or interface declaring the
    392      *              underlying field (or a subclass or implementor
    393      *              thereof), or if the field value cannot be
    394      *              converted to the type {@code char} by a
    395      *              widening conversion.
    396      * @exception NullPointerException      if the specified object is null
    397      *              and the field is an instance field.
    398      * @exception ExceptionInInitializerError if the initialization provoked
    399      *              by this method fails.
    400      * @see Field#get
    401      */
    402     @FastNative
    403     public native char getChar(Object obj)
    404         throws IllegalArgumentException, IllegalAccessException;
    405 
    406     /**
    407      * Gets the value of a static or instance field of type
    408      * {@code short} or of another primitive type convertible to
    409      * type {@code short} via a widening conversion.
    410      *
    411      * @param obj the object to extract the {@code short} value
    412      * from
    413      * @return the value of the field converted to type {@code short}
    414      *
    415      * @exception IllegalAccessException    if this {@code Field} object
    416      *              is enforcing Java language access control and the underlying
    417      *              field is inaccessible.
    418      * @exception IllegalArgumentException  if the specified object is not
    419      *              an instance of the class or interface declaring the
    420      *              underlying field (or a subclass or implementor
    421      *              thereof), or if the field value cannot be
    422      *              converted to the type {@code short} by a
    423      *              widening conversion.
    424      * @exception NullPointerException      if the specified object is null
    425      *              and the field is an instance field.
    426      * @exception ExceptionInInitializerError if the initialization provoked
    427      *              by this method fails.
    428      * @see       Field#get
    429      */
    430     @FastNative
    431     public native short getShort(Object obj)
    432         throws IllegalArgumentException, IllegalAccessException;
    433 
    434     /**
    435      * Gets the value of a static or instance field of type
    436      * {@code int} or of another primitive type convertible to
    437      * type {@code int} via a widening conversion.
    438      *
    439      * @param obj the object to extract the {@code int} value
    440      * from
    441      * @return the value of the field converted to type {@code int}
    442      *
    443      * @exception IllegalAccessException    if this {@code Field} object
    444      *              is enforcing Java language access control and the underlying
    445      *              field is inaccessible.
    446      * @exception IllegalArgumentException  if the specified object is not
    447      *              an instance of the class or interface declaring the
    448      *              underlying field (or a subclass or implementor
    449      *              thereof), or if the field value cannot be
    450      *              converted to the type {@code int} by a
    451      *              widening conversion.
    452      * @exception NullPointerException      if the specified object is null
    453      *              and the field is an instance field.
    454      * @exception ExceptionInInitializerError if the initialization provoked
    455      *              by this method fails.
    456      * @see       Field#get
    457      */
    458     @FastNative
    459     public native int getInt(Object obj)
    460         throws IllegalArgumentException, IllegalAccessException;
    461 
    462     /**
    463      * Gets the value of a static or instance field of type
    464      * {@code long} or of another primitive type convertible to
    465      * type {@code long} via a widening conversion.
    466      *
    467      * @param obj the object to extract the {@code long} value
    468      * from
    469      * @return the value of the field converted to type {@code long}
    470      *
    471      * @exception IllegalAccessException    if this {@code Field} object
    472      *              is enforcing Java language access control and the underlying
    473      *              field is inaccessible.
    474      * @exception IllegalArgumentException  if the specified object is not
    475      *              an instance of the class or interface declaring the
    476      *              underlying field (or a subclass or implementor
    477      *              thereof), or if the field value cannot be
    478      *              converted to the type {@code long} by a
    479      *              widening conversion.
    480      * @exception NullPointerException      if the specified object is null
    481      *              and the field is an instance field.
    482      * @exception ExceptionInInitializerError if the initialization provoked
    483      *              by this method fails.
    484      * @see       Field#get
    485      */
    486     @FastNative
    487     public native long getLong(Object obj)
    488         throws IllegalArgumentException, IllegalAccessException;
    489 
    490     /**
    491      * Gets the value of a static or instance field of type
    492      * {@code float} or of another primitive type convertible to
    493      * type {@code float} via a widening conversion.
    494      *
    495      * @param obj the object to extract the {@code float} value
    496      * from
    497      * @return the value of the field converted to type {@code float}
    498      *
    499      * @exception IllegalAccessException    if this {@code Field} object
    500      *              is enforcing Java language access control and the underlying
    501      *              field is inaccessible.
    502      * @exception IllegalArgumentException  if the specified object is not
    503      *              an instance of the class or interface declaring the
    504      *              underlying field (or a subclass or implementor
    505      *              thereof), or if the field value cannot be
    506      *              converted to the type {@code float} by a
    507      *              widening conversion.
    508      * @exception NullPointerException      if the specified object is null
    509      *              and the field is an instance field.
    510      * @exception ExceptionInInitializerError if the initialization provoked
    511      *              by this method fails.
    512      * @see Field#get
    513      */
    514     @FastNative
    515     public native float getFloat(Object obj)
    516         throws IllegalArgumentException, IllegalAccessException;
    517 
    518     /**
    519      * Gets the value of a static or instance field of type
    520      * {@code double} or of another primitive type convertible to
    521      * type {@code double} via a widening conversion.
    522      *
    523      * @param obj the object to extract the {@code double} value
    524      * from
    525      * @return the value of the field converted to type {@code double}
    526      *
    527      * @exception IllegalAccessException    if this {@code Field} object
    528      *              is enforcing Java language access control and the underlying
    529      *              field is inaccessible.
    530      * @exception IllegalArgumentException  if the specified object is not
    531      *              an instance of the class or interface declaring the
    532      *              underlying field (or a subclass or implementor
    533      *              thereof), or if the field value cannot be
    534      *              converted to the type {@code double} by a
    535      *              widening conversion.
    536      * @exception NullPointerException      if the specified object is null
    537      *              and the field is an instance field.
    538      * @exception ExceptionInInitializerError if the initialization provoked
    539      *              by this method fails.
    540      * @see       Field#get
    541      */
    542     @FastNative
    543     public native double getDouble(Object obj)
    544         throws IllegalArgumentException, IllegalAccessException;
    545 
    546     /**
    547      * Sets the field represented by this {@code Field} object on the
    548      * specified object argument to the specified new value. The new
    549      * value is automatically unwrapped if the underlying field has a
    550      * primitive type.
    551      *
    552      * <p>The operation proceeds as follows:
    553      *
    554      * <p>If the underlying field is static, the {@code obj} argument is
    555      * ignored; it may be null.
    556      *
    557      * <p>Otherwise the underlying field is an instance field.  If the
    558      * specified object argument is null, the method throws a
    559      * {@code NullPointerException}.  If the specified object argument is not
    560      * an instance of the class or interface declaring the underlying
    561      * field, the method throws an {@code IllegalArgumentException}.
    562      *
    563      * <p>If this {@code Field} object is enforcing Java language access control, and
    564      * the underlying field is inaccessible, the method throws an
    565      * {@code IllegalAccessException}.
    566      *
    567      * <p>If the underlying field is final, the method throws an
    568      * {@code IllegalAccessException} unless {@code setAccessible(true)}
    569      * has succeeded for this {@code Field} object
    570      * and the field is non-static. Setting a final field in this way
    571      * is meaningful only during deserialization or reconstruction of
    572      * instances of classes with blank final fields, before they are
    573      * made available for access by other parts of a program. Use in
    574      * any other context may have unpredictable effects, including cases
    575      * in which other parts of a program continue to use the original
    576      * value of this field.
    577      *
    578      * <p>If the underlying field is of a primitive type, an unwrapping
    579      * conversion is attempted to convert the new value to a value of
    580      * a primitive type.  If this attempt fails, the method throws an
    581      * {@code IllegalArgumentException}.
    582      *
    583      * <p>If, after possible unwrapping, the new value cannot be
    584      * converted to the type of the underlying field by an identity or
    585      * widening conversion, the method throws an
    586      * {@code IllegalArgumentException}.
    587      *
    588      * <p>If the underlying field is static, the class that declared the
    589      * field is initialized if it has not already been initialized.
    590      *
    591      * <p>The field is set to the possibly unwrapped and widened new value.
    592      *
    593      * <p>If the field is hidden in the type of {@code obj},
    594      * the field's value is set according to the preceding rules.
    595      *
    596      * @param obj the object whose field should be modified
    597      * @param value the new value for the field of {@code obj}
    598      * being modified
    599      *
    600      * @exception IllegalAccessException    if this {@code Field} object
    601      *              is enforcing Java language access control and the underlying
    602      *              field is either inaccessible or final.
    603      * @exception IllegalArgumentException  if the specified object is not an
    604      *              instance of the class or interface declaring the underlying
    605      *              field (or a subclass or implementor thereof),
    606      *              or if an unwrapping conversion fails.
    607      * @exception NullPointerException      if the specified object is null
    608      *              and the field is an instance field.
    609      * @exception ExceptionInInitializerError if the initialization provoked
    610      *              by this method fails.
    611      */
    612     @FastNative
    613     public native void set(Object obj, Object value)
    614         throws IllegalArgumentException, IllegalAccessException;
    615 
    616     /**
    617      * Sets the value of a field as a {@code boolean} on the specified object.
    618      * This method is equivalent to
    619      * {@code set(obj, zObj)},
    620      * where {@code zObj} is a {@code Boolean} object and
    621      * {@code zObj.booleanValue() == z}.
    622      *
    623      * @param obj the object whose field should be modified
    624      * @param z   the new value for the field of {@code obj}
    625      * being modified
    626      *
    627      * @exception IllegalAccessException    if this {@code Field} object
    628      *              is enforcing Java language access control and the underlying
    629      *              field is either inaccessible or final.
    630      * @exception IllegalArgumentException  if the specified object is not an
    631      *              instance of the class or interface declaring the underlying
    632      *              field (or a subclass or implementor thereof),
    633      *              or if an unwrapping conversion fails.
    634      * @exception NullPointerException      if the specified object is null
    635      *              and the field is an instance field.
    636      * @exception ExceptionInInitializerError if the initialization provoked
    637      *              by this method fails.
    638      * @see       Field#set
    639      */
    640     @FastNative
    641     public native void setBoolean(Object obj, boolean z)
    642         throws IllegalArgumentException, IllegalAccessException;
    643 
    644     /**
    645      * Sets the value of a field as a {@code byte} on the specified object.
    646      * This method is equivalent to
    647      * {@code set(obj, bObj)},
    648      * where {@code bObj} is a {@code Byte} object and
    649      * {@code bObj.byteValue() == b}.
    650      *
    651      * @param obj the object whose field should be modified
    652      * @param b   the new value for the field of {@code obj}
    653      * being modified
    654      *
    655      * @exception IllegalAccessException    if this {@code Field} object
    656      *              is enforcing Java language access control and the underlying
    657      *              field is either inaccessible or final.
    658      * @exception IllegalArgumentException  if the specified object is not an
    659      *              instance of the class or interface declaring the underlying
    660      *              field (or a subclass or implementor thereof),
    661      *              or if an unwrapping conversion fails.
    662      * @exception NullPointerException      if the specified object is null
    663      *              and the field is an instance field.
    664      * @exception ExceptionInInitializerError if the initialization provoked
    665      *              by this method fails.
    666      * @see       Field#set
    667      */
    668     @FastNative
    669     public native void setByte(Object obj, byte b)
    670         throws IllegalArgumentException, IllegalAccessException;
    671 
    672     /**
    673      * Sets the value of a field as a {@code char} on the specified object.
    674      * This method is equivalent to
    675      * {@code set(obj, cObj)},
    676      * where {@code cObj} is a {@code Character} object and
    677      * {@code cObj.charValue() == c}.
    678      *
    679      * @param obj the object whose field should be modified
    680      * @param c   the new value for the field of {@code obj}
    681      * being modified
    682      *
    683      * @exception IllegalAccessException    if this {@code Field} object
    684      *              is enforcing Java language access control and the underlying
    685      *              field is either inaccessible or final.
    686      * @exception IllegalArgumentException  if the specified object is not an
    687      *              instance of the class or interface declaring the underlying
    688      *              field (or a subclass or implementor thereof),
    689      *              or if an unwrapping conversion fails.
    690      * @exception NullPointerException      if the specified object is null
    691      *              and the field is an instance field.
    692      * @exception ExceptionInInitializerError if the initialization provoked
    693      *              by this method fails.
    694      * @see       Field#set
    695      */
    696     @FastNative
    697     public native void setChar(Object obj, char c)
    698         throws IllegalArgumentException, IllegalAccessException;
    699 
    700     /**
    701      * Sets the value of a field as a {@code short} on the specified object.
    702      * This method is equivalent to
    703      * {@code set(obj, sObj)},
    704      * where {@code sObj} is a {@code Short} object and
    705      * {@code sObj.shortValue() == s}.
    706      *
    707      * @param obj the object whose field should be modified
    708      * @param s   the new value for the field of {@code obj}
    709      * being modified
    710      *
    711      * @exception IllegalAccessException    if this {@code Field} object
    712      *              is enforcing Java language access control and the underlying
    713      *              field is either inaccessible or final.
    714      * @exception IllegalArgumentException  if the specified object is not an
    715      *              instance of the class or interface declaring the underlying
    716      *              field (or a subclass or implementor thereof),
    717      *              or if an unwrapping conversion fails.
    718      * @exception NullPointerException      if the specified object is null
    719      *              and the field is an instance field.
    720      * @exception ExceptionInInitializerError if the initialization provoked
    721      *              by this method fails.
    722      * @see       Field#set
    723      */
    724     @FastNative
    725     public native void setShort(Object obj, short s)
    726         throws IllegalArgumentException, IllegalAccessException;
    727 
    728     /**
    729      * Sets the value of a field as an {@code int} on the specified object.
    730      * This method is equivalent to
    731      * {@code set(obj, iObj)},
    732      * where {@code iObj} is a {@code Integer} object and
    733      * {@code iObj.intValue() == i}.
    734      *
    735      * @param obj the object whose field should be modified
    736      * @param i   the new value for the field of {@code obj}
    737      * being modified
    738      *
    739      * @exception IllegalAccessException    if this {@code Field} object
    740      *              is enforcing Java language access control and the underlying
    741      *              field is either inaccessible or final.
    742      * @exception IllegalArgumentException  if the specified object is not an
    743      *              instance of the class or interface declaring the underlying
    744      *              field (or a subclass or implementor thereof),
    745      *              or if an unwrapping conversion fails.
    746      * @exception NullPointerException      if the specified object is null
    747      *              and the field is an instance field.
    748      * @exception ExceptionInInitializerError if the initialization provoked
    749      *              by this method fails.
    750      * @see       Field#set
    751      */
    752     @FastNative
    753     public native void setInt(Object obj, int i)
    754         throws IllegalArgumentException, IllegalAccessException;
    755 
    756     /**
    757      * Sets the value of a field as a {@code long} on the specified object.
    758      * This method is equivalent to
    759      * {@code set(obj, lObj)},
    760      * where {@code lObj} is a {@code Long} object and
    761      * {@code lObj.longValue() == l}.
    762      *
    763      * @param obj the object whose field should be modified
    764      * @param l   the new value for the field of {@code obj}
    765      * being modified
    766      *
    767      * @exception IllegalAccessException    if this {@code Field} object
    768      *              is enforcing Java language access control and the underlying
    769      *              field is either inaccessible or final.
    770      * @exception IllegalArgumentException  if the specified object is not an
    771      *              instance of the class or interface declaring the underlying
    772      *              field (or a subclass or implementor thereof),
    773      *              or if an unwrapping conversion fails.
    774      * @exception NullPointerException      if the specified object is null
    775      *              and the field is an instance field.
    776      * @exception ExceptionInInitializerError if the initialization provoked
    777      *              by this method fails.
    778      * @see       Field#set
    779      */
    780     @FastNative
    781     public native void setLong(Object obj, long l)
    782         throws IllegalArgumentException, IllegalAccessException;
    783 
    784     /**
    785      * Sets the value of a field as a {@code float} on the specified object.
    786      * This method is equivalent to
    787      * {@code set(obj, fObj)},
    788      * where {@code fObj} is a {@code Float} object and
    789      * {@code fObj.floatValue() == f}.
    790      *
    791      * @param obj the object whose field should be modified
    792      * @param f   the new value for the field of {@code obj}
    793      * being modified
    794      *
    795      * @exception IllegalAccessException    if this {@code Field} object
    796      *              is enforcing Java language access control and the underlying
    797      *              field is either inaccessible or final.
    798      * @exception IllegalArgumentException  if the specified object is not an
    799      *              instance of the class or interface declaring the underlying
    800      *              field (or a subclass or implementor thereof),
    801      *              or if an unwrapping conversion fails.
    802      * @exception NullPointerException      if the specified object is null
    803      *              and the field is an instance field.
    804      * @exception ExceptionInInitializerError if the initialization provoked
    805      *              by this method fails.
    806      * @see       Field#set
    807      */
    808     @FastNative
    809     public native void setFloat(Object obj, float f)
    810         throws IllegalArgumentException, IllegalAccessException;
    811 
    812     /**
    813      * Sets the value of a field as a {@code double} on the specified object.
    814      * This method is equivalent to
    815      * {@code set(obj, dObj)},
    816      * where {@code dObj} is a {@code Double} object and
    817      * {@code dObj.doubleValue() == d}.
    818      *
    819      * @param obj the object whose field should be modified
    820      * @param d   the new value for the field of {@code obj}
    821      * being modified
    822      *
    823      * @exception IllegalAccessException    if this {@code Field} object
    824      *              is enforcing Java language access control and the underlying
    825      *              field is either inaccessible or final.
    826      * @exception IllegalArgumentException  if the specified object is not an
    827      *              instance of the class or interface declaring the underlying
    828      *              field (or a subclass or implementor thereof),
    829      *              or if an unwrapping conversion fails.
    830      * @exception NullPointerException      if the specified object is null
    831      *              and the field is an instance field.
    832      * @exception ExceptionInInitializerError if the initialization provoked
    833      *              by this method fails.
    834      * @see       Field#set
    835      */
    836     @FastNative
    837     public native void setDouble(Object obj, double d)
    838         throws IllegalArgumentException, IllegalAccessException;
    839 
    840     /**
    841      * @throws NullPointerException {@inheritDoc}
    842      * @since 1.5
    843      */
    844     @Override
    845     public <T extends Annotation> T getAnnotation(Class<T> annotationClass) {
    846         Objects.requireNonNull(annotationClass);
    847         return getAnnotationNative(annotationClass);
    848     }
    849     @FastNative
    850     private native <A extends Annotation> A getAnnotationNative(Class<A> annotationType);
    851 
    852     /**
    853      * {@inheritDoc}
    854      * @throws NullPointerException {@inheritDoc}
    855      * @since 1.8
    856      */
    857     @Override
    858     public <T extends Annotation> T[] getAnnotationsByType(Class<T> annotationClass) {
    859         // Android-changed: Uses AnnotatedElements instead.
    860         return AnnotatedElements.getDirectOrIndirectAnnotationsByType(this, annotationClass);
    861     }
    862 
    863 
    864     @Override public boolean isAnnotationPresent(Class<? extends Annotation> annotationType) {
    865         if (annotationType == null) {
    866             throw new NullPointerException("annotationType == null");
    867         }
    868         return isAnnotationPresentNative(annotationType);
    869     }
    870     @FastNative
    871     private native boolean isAnnotationPresentNative(Class<? extends Annotation> annotationType);
    872 
    873     /**
    874      * {@inheritDoc}
    875      */
    876     @Override
    877     @FastNative
    878     public native Annotation[] getDeclaredAnnotations();
    879 
    880     /**
    881      * Returns the index of this field's ID in its dex file.
    882      *
    883      * @hide
    884      */
    885     public int getDexFieldIndex() {
    886         return dexFieldIndex;
    887     }
    888 
    889     /**
    890      * Returns the offset of the field within an instance, or for static fields, the class.
    891      *
    892      * @hide
    893      */
    894     public int getOffset() {
    895         return offset;
    896     }
    897 
    898     /**
    899      * @hide - export for use by {@code java.lang.invoke.*}
    900      */
    901     @FastNative
    902     public native long getArtField();
    903 }
    904