| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| /* |
| * Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package java.lang.reflect; |
| |
| import java.lang.annotation.Annotation; |
| import java.util.Comparator; |
| import org.apache.harmony.kernel.vm.StringUtils; |
| import libcore.reflect.GenericSignatureParser; |
| import libcore.reflect.Types; |
| |
| /** |
| * This class represents a field. Information about the field can be accessed, |
| * and the field's value can be accessed dynamically. |
| */ |
| public final class Field extends AccessibleObject implements Member { |
| |
| /** |
| * Orders fields by their name and declaring class. |
| * |
| * @hide |
| */ |
| public static final Comparator<Field> ORDER_BY_NAME_AND_DECLARING_CLASS |
| = new Comparator<Field>() { |
| @Override public int compare(Field a, Field b) { |
| int comparison = a.name.compareTo(b.name); |
| if (comparison != 0) { |
| return comparison; |
| } |
| |
| return a.getDeclaringClass().getName().compareTo(b.getDeclaringClass().getName()); |
| } |
| }; |
| |
| private Class<?> declaringClass; |
| |
| private Class<?> type; |
| |
| private Type genericType; |
| |
| private volatile boolean genericTypesAreInitialized = false; |
| |
| private String name; |
| |
| private int slot; |
| |
| private final int fieldDexIndex; |
| |
| private static final char TYPE_BOOLEAN = 'Z'; |
| |
| private static final char TYPE_BYTE = 'B'; |
| |
| private static final char TYPE_CHAR = 'C'; |
| |
| private static final char TYPE_SHORT = 'S'; |
| |
| private static final char TYPE_INTEGER = 'I'; |
| |
| private static final char TYPE_FLOAT = 'F'; |
| |
| private static final char TYPE_LONG = 'J'; |
| |
| private static final char TYPE_DOUBLE = 'D'; |
| |
| private Field(Class<?> declaringClass, Class<?> type, String name, int slot, int fieldDexIndex) { |
| this.declaringClass = declaringClass; |
| this.type = type; |
| this.name = name; |
| this.slot = slot; |
| this.fieldDexIndex = fieldDexIndex; |
| } |
| |
| /** |
| * Returns the index of this field's ID in its dex file. |
| * @hide |
| */ |
| public int getDexFieldIndex() { |
| return fieldDexIndex; |
| } |
| |
| private synchronized void initGenericType() { |
| if (!genericTypesAreInitialized) { |
| String signatureAttribute = getSignatureAttribute(); |
| GenericSignatureParser parser = new GenericSignatureParser( |
| declaringClass.getClassLoader()); |
| parser.parseForField(this.declaringClass, signatureAttribute); |
| genericType = parser.fieldType; |
| if (genericType == null) { |
| genericType = getType(); |
| } |
| genericTypesAreInitialized = true; |
| } |
| } |
| |
| /** {@inheritDoc} */ |
| @Override |
| /* package */String getSignatureAttribute() { |
| Object[] annotation = getSignatureAnnotation(declaringClass, slot); |
| |
| if (annotation == null) { |
| return null; |
| } |
| |
| return StringUtils.combineStrings(annotation); |
| } |
| |
| /** |
| * Get the Signature annotation for this field. Returns null if not found. |
| */ |
| native private Object[] getSignatureAnnotation(Class declaringClass, int slot); |
| |
| /** |
| * Indicates whether or not this field is synthetic. |
| * |
| * @return {@code true} if this field is synthetic, {@code false} otherwise |
| */ |
| public boolean isSynthetic() { |
| int flags = getFieldModifiers(declaringClass, slot); |
| return (flags & Modifier.SYNTHETIC) != 0; |
| } |
| |
| /** |
| * Returns the string representation of this field, including the field's |
| * generic type. |
| * |
| * @return the string representation of this field |
| */ |
| public String toGenericString() { |
| StringBuilder sb = new StringBuilder(80); |
| // append modifiers if any |
| int modifier = getModifiers(); |
| if (modifier != 0) { |
| sb.append(Modifier.toString(modifier)).append(' '); |
| } |
| // append generic type |
| appendGenericType(sb, getGenericType()); |
| sb.append(' '); |
| // append full field name |
| sb.append(getDeclaringClass().getName()).append('.').append(getName()); |
| return sb.toString(); |
| } |
| |
| /** |
| * Indicates whether or not this field is an enumeration constant. |
| * |
| * @return {@code true} if this field is an enumeration constant, {@code |
| * false} otherwise |
| */ |
| public boolean isEnumConstant() { |
| int flags = getFieldModifiers(declaringClass, slot); |
| return (flags & Modifier.ENUM) != 0; |
| } |
| |
| /** |
| * Returns the generic type of this field. |
| * |
| * @return the generic type |
| * @throws GenericSignatureFormatError |
| * if the generic field signature is invalid |
| * @throws TypeNotPresentException |
| * if the generic type points to a missing type |
| * @throws MalformedParameterizedTypeException |
| * if the generic type points to a type that cannot be |
| * instantiated for some reason |
| */ |
| public Type getGenericType() { |
| initGenericType(); |
| return Types.getType(genericType); |
| } |
| |
| @Override public Annotation[] getDeclaredAnnotations() { |
| return getDeclaredAnnotations(declaringClass, slot); |
| } |
| private static native Annotation[] getDeclaredAnnotations(Class declaringClass, int slot); |
| |
| @Override public <A extends Annotation> A getAnnotation(Class<A> annotationType) { |
| if (annotationType == null) { |
| throw new NullPointerException("annotationType == null"); |
| } |
| return getAnnotation(declaringClass, slot, annotationType); |
| } |
| private static native <A extends Annotation> A getAnnotation( |
| Class<?> declaringClass, int slot, Class<A> annotationType); |
| |
| @Override public boolean isAnnotationPresent(Class<? extends Annotation> annotationType) { |
| if (annotationType == null) { |
| throw new NullPointerException("annotationType == null"); |
| } |
| return isAnnotationPresent(declaringClass, slot, annotationType); |
| } |
| private static native boolean isAnnotationPresent( |
| Class<?> declaringClass, int slot, Class<? extends Annotation> annotationType); |
| |
| /** |
| * Indicates whether or not the specified {@code object} is equal to this |
| * field. To be equal, the specified object must be an instance of |
| * {@code Field} with the same declaring class, type and name as this field. |
| * |
| * @param object |
| * the object to compare |
| * @return {@code true} if the specified object is equal to this method, |
| * {@code false} otherwise |
| * @see #hashCode |
| */ |
| @Override |
| public boolean equals(Object object) { |
| return object instanceof Field && toString().equals(object.toString()); |
| } |
| |
| /** |
| * Returns the value of the field in the specified object. This reproduces |
| * the effect of {@code object.fieldName} |
| * |
| * <p>If the type of this field is a primitive type, the field value is |
| * automatically boxed. |
| * |
| * <p>If this field is static, the object argument is ignored. |
| * Otherwise, if the object is null, a NullPointerException is thrown. If |
| * the object is not an instance of the declaring class of the method, an |
| * IllegalArgumentException is thrown. |
| * |
| * <p>If this Field object is enforcing access control (see AccessibleObject) |
| * and this field is not accessible from the current context, an |
| * IllegalAccessException is thrown. |
| * |
| * @param object |
| * the object to access |
| * @return the field value, possibly boxed |
| * @throws NullPointerException |
| * if the object is {@code null} and the field is non-static |
| * @throws IllegalArgumentException |
| * if the object is not compatible with the declaring class |
| * @throws IllegalAccessException |
| * if this field is not accessible |
| */ |
| public Object get(Object object) throws IllegalAccessException, IllegalArgumentException { |
| return getField(object, declaringClass, type, slot, flag); |
| } |
| |
| /** |
| * Returns the value of the field in the specified object as a {@code |
| * boolean}. This reproduces the effect of {@code object.fieldName} |
| * <p> |
| * If this field is static, the object argument is ignored. |
| * Otherwise, if the object is {@code null}, a NullPointerException is |
| * thrown. If the object is not an instance of the declaring class of the |
| * method, an IllegalArgumentException is thrown. |
| * <p> |
| * If this Field object is enforcing access control (see AccessibleObject) |
| * and this field is not accessible from the current context, an |
| * IllegalAccessException is thrown. |
| * |
| * @param object |
| * the object to access |
| * @return the field value |
| * @throws NullPointerException |
| * if the object is {@code null} and the field is non-static |
| * @throws IllegalArgumentException |
| * if the object is not compatible with the declaring class |
| * @throws IllegalAccessException |
| * if this field is not accessible |
| */ |
| public boolean getBoolean(Object object) throws IllegalAccessException, |
| IllegalArgumentException { |
| return getZField(object, declaringClass, type, slot, flag, TYPE_BOOLEAN); |
| } |
| |
| /** |
| * Returns the value of the field in the specified object as a {@code byte}. |
| * This reproduces the effect of {@code object.fieldName} |
| * <p> |
| * If this field is static, the object argument is ignored. |
| * Otherwise, if the object is {@code null}, a NullPointerException is |
| * thrown. If the object is not an instance of the declaring class of the |
| * method, an IllegalArgumentException is thrown. |
| * <p> |
| * If this Field object is enforcing access control (see AccessibleObject) |
| * and this field is not accessible from the current context, an |
| * IllegalAccessException is thrown. |
| * |
| * @param object |
| * the object to access |
| * @return the field value |
| * @throws NullPointerException |
| * if the object is {@code null} and the field is non-static |
| * @throws IllegalArgumentException |
| * if the object is not compatible with the declaring class |
| * @throws IllegalAccessException |
| * if this field is not accessible |
| */ |
| public byte getByte(Object object) throws IllegalAccessException, IllegalArgumentException { |
| return getBField(object, declaringClass, type, slot, flag, TYPE_BYTE); |
| } |
| |
| /** |
| * Returns the value of the field in the specified object as a {@code char}. |
| * This reproduces the effect of {@code object.fieldName} |
| * <p> |
| * If this field is static, the object argument is ignored. |
| * Otherwise, if the object is {@code null}, a NullPointerException is |
| * thrown. If the object is not an instance of the declaring class of the |
| * method, an IllegalArgumentException is thrown. |
| * <p> |
| * If this Field object is enforcing access control (see AccessibleObject) |
| * and this field is not accessible from the current context, an |
| * IllegalAccessException is thrown. |
| * |
| * @param object |
| * the object to access |
| * @return the field value |
| * @throws NullPointerException |
| * if the object is {@code null} and the field is non-static |
| * @throws IllegalArgumentException |
| * if the object is not compatible with the declaring class |
| * @throws IllegalAccessException |
| * if this field is not accessible |
| */ |
| public char getChar(Object object) throws IllegalAccessException, IllegalArgumentException { |
| return getCField(object, declaringClass, type, slot, flag, TYPE_CHAR); |
| } |
| |
| /** |
| * Returns the class that declares this field. |
| * |
| * @return the declaring class |
| */ |
| public Class<?> getDeclaringClass() { |
| return declaringClass; |
| } |
| |
| /** |
| * Returns the value of the field in the specified object as a {@code |
| * double}. This reproduces the effect of {@code object.fieldName} |
| * <p> |
| * If this field is static, the object argument is ignored. |
| * Otherwise, if the object is {@code null}, a NullPointerException is |
| * thrown. If the object is not an instance of the declaring class of the |
| * method, an IllegalArgumentException is thrown. |
| * <p> |
| * If this Field object is enforcing access control (see AccessibleObject) |
| * and this field is not accessible from the current context, an |
| * IllegalAccessException is thrown. |
| * |
| * @param object |
| * the object to access |
| * @return the field value |
| * @throws NullPointerException |
| * if the object is {@code null} and the field is non-static |
| * @throws IllegalArgumentException |
| * if the object is not compatible with the declaring class |
| * @throws IllegalAccessException |
| * if this field is not accessible |
| */ |
| public double getDouble(Object object) throws IllegalAccessException, IllegalArgumentException { |
| return getDField(object, declaringClass, type, slot, flag, TYPE_DOUBLE); |
| } |
| |
| /** |
| * Returns the value of the field in the specified object as a {@code float} |
| * . This reproduces the effect of {@code object.fieldName} |
| * <p> |
| * If this field is static, the object argument is ignored. |
| * Otherwise, if the object is {@code null}, a NullPointerException is |
| * thrown. If the object is not an instance of the declaring class of the |
| * method, an IllegalArgumentException is thrown. |
| * <p> |
| * If this Field object is enforcing access control (see AccessibleObject) |
| * and this field is not accessible from the current context, an |
| * IllegalAccessException is thrown. |
| * |
| * @param object |
| * the object to access |
| * @return the field value |
| * @throws NullPointerException |
| * if the object is {@code null} and the field is non-static |
| * @throws IllegalArgumentException |
| * if the object is not compatible with the declaring class |
| * @throws IllegalAccessException |
| * if this field is not accessible |
| */ |
| public float getFloat(Object object) throws IllegalAccessException, IllegalArgumentException { |
| return getFField(object, declaringClass, type, slot, flag, TYPE_FLOAT); |
| } |
| |
| /** |
| * Returns the value of the field in the specified object as an {@code int}. |
| * This reproduces the effect of {@code object.fieldName} |
| * <p> |
| * If this field is static, the object argument is ignored. |
| * Otherwise, if the object is {@code null}, a NullPointerException is |
| * thrown. If the object is not an instance of the declaring class of the |
| * method, an IllegalArgumentException is thrown. |
| * <p> |
| * If this Field object is enforcing access control (see AccessibleObject) |
| * and this field is not accessible from the current context, an |
| * IllegalAccessException is thrown. |
| * |
| * @param object |
| * the object to access |
| * @return the field value |
| * @throws NullPointerException |
| * if the object is {@code null} and the field is non-static |
| * @throws IllegalArgumentException |
| * if the object is not compatible with the declaring class |
| * @throws IllegalAccessException |
| * if this field is not accessible |
| */ |
| public int getInt(Object object) throws IllegalAccessException, IllegalArgumentException { |
| return getIField(object, declaringClass, type, slot, flag, TYPE_INTEGER); |
| } |
| |
| /** |
| * Returns the value of the field in the specified object as a {@code long}. |
| * This reproduces the effect of {@code object.fieldName} |
| * <p> |
| * If this field is static, the object argument is ignored. |
| * Otherwise, if the object is {@code null}, a NullPointerException is |
| * thrown. If the object is not an instance of the declaring class of the |
| * method, an IllegalArgumentException is thrown. |
| * <p> |
| * If this Field object is enforcing access control (see AccessibleObject) |
| * and this field is not accessible from the current context, an |
| * IllegalAccessException is thrown. |
| * |
| * @param object |
| * the object to access |
| * @return the field value |
| * @throws NullPointerException |
| * if the object is {@code null} and the field is non-static |
| * @throws IllegalArgumentException |
| * if the object is not compatible with the declaring class |
| * @throws IllegalAccessException |
| * if this field is not accessible |
| */ |
| public long getLong(Object object) throws IllegalAccessException, IllegalArgumentException { |
| return getJField(object, declaringClass, type, slot, flag, TYPE_LONG); |
| } |
| |
| /** |
| * Returns the modifiers for this field. The {@link Modifier} class should |
| * be used to decode the result. |
| * |
| * @return the modifiers for this field |
| * @see Modifier |
| */ |
| public int getModifiers() { |
| return getFieldModifiers(declaringClass, slot); |
| } |
| |
| private native int getFieldModifiers(Class<?> declaringClass, int slot); |
| |
| /** |
| * Returns the name of this field. |
| * |
| * @return the name of this field |
| */ |
| public String getName() { |
| return name; |
| } |
| |
| /** |
| * Returns the value of the field in the specified object as a {@code short} |
| * . This reproduces the effect of {@code object.fieldName} |
| * <p> |
| * If this field is static, the object argument is ignored. |
| * Otherwise, if the object is {@code null}, a NullPointerException is |
| * thrown. If the object is not an instance of the declaring class of the |
| * method, an IllegalArgumentException is thrown. |
| * <p> |
| * If this Field object is enforcing access control (see AccessibleObject) |
| * and this field is not accessible from the current context, an |
| * IllegalAccessException is thrown. |
| * |
| * @param object |
| * the object to access |
| * @return the field value |
| * @throws NullPointerException |
| * if the object is {@code null} and the field is non-static |
| * @throws IllegalArgumentException |
| * if the object is not compatible with the declaring class |
| * @throws IllegalAccessException |
| * if this field is not accessible |
| */ |
| public short getShort(Object object) throws IllegalAccessException, IllegalArgumentException { |
| return getSField(object, declaringClass, type, slot, flag, TYPE_SHORT); |
| } |
| |
| /** |
| * Returns the constructor's signature in non-printable form. This is called |
| * (only) from IO native code and needed for deriving the serialVersionUID |
| * of the class |
| * |
| * @return the constructor's signature. |
| */ |
| @SuppressWarnings("unused") |
| private String getSignature() { |
| return getSignature(type); |
| } |
| |
| /** |
| * Return the {@link Class} associated with the type of this field. |
| * |
| * @return the type of this field |
| */ |
| public Class<?> getType() { |
| return type; |
| } |
| |
| /** |
| * Returns an integer hash code for this field. Objects which are equal |
| * return the same value for this method. |
| * <p> |
| * The hash code for a Field is the exclusive-or combination of the hash |
| * code of the field's name and the hash code of the name of its declaring |
| * class. |
| * |
| * @return the hash code for this field |
| * @see #equals |
| */ |
| @Override |
| public int hashCode() { |
| return name.hashCode() ^ getDeclaringClass().getName().hashCode(); |
| } |
| |
| /** |
| * Sets the value of the field in the specified object to the value. This |
| * reproduces the effect of {@code object.fieldName = value} |
| * |
| * <p>If this field is static, the object argument is ignored. |
| * Otherwise, if the object is {@code null}, a NullPointerException is |
| * thrown. If the object is not an instance of the declaring class of the |
| * method, an IllegalArgumentException is thrown. |
| * |
| * <p>If this Field object is enforcing access control (see AccessibleObject) |
| * and this field is not accessible from the current context, an |
| * IllegalAccessException is thrown. |
| * |
| * <p>If the field type is a primitive type, the value is automatically |
| * unboxed. If the unboxing fails, an IllegalArgumentException is thrown. If |
| * the value cannot be converted to the field type via a widening |
| * conversion, an IllegalArgumentException is thrown. |
| * |
| * @param object |
| * the object to access |
| * @param value |
| * the new value |
| * @throws NullPointerException |
| * if the object is {@code null} and the field is non-static |
| * @throws IllegalArgumentException |
| * if the object is not compatible with the declaring class |
| * @throws IllegalAccessException |
| * if this field is not accessible |
| */ |
| public void set(Object object, Object value) throws IllegalAccessException, |
| IllegalArgumentException { |
| setField(object, declaringClass, type, slot, flag, value); |
| } |
| |
| /** |
| * Sets the value of the field in the specified object to the {@code |
| * boolean} value. This reproduces the effect of {@code object.fieldName = |
| * value} |
| * <p> |
| * If this field is static, the object argument is ignored. |
| * Otherwise, if the object is {@code null}, a NullPointerException is |
| * thrown. If the object is not an instance of the declaring class of the |
| * method, an IllegalArgumentException is thrown. |
| * <p> |
| * If this Field object is enforcing access control (see AccessibleObject) |
| * and this field is not accessible from the current context, an |
| * IllegalAccessException is thrown. |
| * <p> |
| * If the value cannot be converted to the field type via a widening |
| * conversion, an IllegalArgumentException is thrown. |
| * |
| * @param object |
| * the object to access |
| * @param value |
| * the new value |
| * @throws NullPointerException |
| * if the object is {@code null} and the field is non-static |
| * @throws IllegalArgumentException |
| * if the object is not compatible with the declaring class |
| * @throws IllegalAccessException |
| * if this field is not accessible |
| */ |
| public void setBoolean(Object object, boolean value) throws IllegalAccessException, |
| IllegalArgumentException { |
| setZField(object, declaringClass, type, slot, flag, TYPE_BOOLEAN, value); |
| } |
| |
| /** |
| * Sets the value of the field in the specified object to the {@code byte} |
| * value. This reproduces the effect of {@code object.fieldName = value} |
| * <p> |
| * If this field is static, the object argument is ignored. |
| * Otherwise, if the object is {@code null}, a NullPointerException is |
| * thrown. If the object is not an instance of the declaring class of the |
| * method, an IllegalArgumentException is thrown. |
| * <p> |
| * If this Field object is enforcing access control (see AccessibleObject) |
| * and this field is not accessible from the current context, an |
| * IllegalAccessException is thrown. |
| * <p> |
| * If the value cannot be converted to the field type via a widening |
| * conversion, an IllegalArgumentException is thrown. |
| * |
| * @param object |
| * the object to access |
| * @param value |
| * the new value |
| * @throws NullPointerException |
| * if the object is {@code null} and the field is non-static |
| * @throws IllegalArgumentException |
| * if the object is not compatible with the declaring class |
| * @throws IllegalAccessException |
| * if this field is not accessible |
| */ |
| public void setByte(Object object, byte value) throws IllegalAccessException, |
| IllegalArgumentException { |
| setBField(object, declaringClass, type, slot, flag, TYPE_BYTE, value); |
| } |
| |
| /** |
| * Sets the value of the field in the specified object to the {@code char} |
| * value. This reproduces the effect of {@code object.fieldName = value} |
| * <p> |
| * If this field is static, the object argument is ignored. |
| * Otherwise, if the object is {@code null}, a NullPointerException is |
| * thrown. If the object is not an instance of the declaring class of the |
| * method, an IllegalArgumentException is thrown. |
| * <p> |
| * If this Field object is enforcing access control (see AccessibleObject) |
| * and this field is not accessible from the current context, an |
| * IllegalAccessException is thrown. |
| * <p> |
| * If the value cannot be converted to the field type via a widening |
| * conversion, an IllegalArgumentException is thrown. |
| * |
| * @param object |
| * the object to access |
| * @param value |
| * the new value |
| * @throws NullPointerException |
| * if the object is {@code null} and the field is non-static |
| * @throws IllegalArgumentException |
| * if the object is not compatible with the declaring class |
| * @throws IllegalAccessException |
| * if this field is not accessible |
| */ |
| public void setChar(Object object, char value) throws IllegalAccessException, |
| IllegalArgumentException { |
| setCField(object, declaringClass, type, slot, flag, TYPE_CHAR, value); |
| } |
| |
| /** |
| * Sets the value of the field in the specified object to the {@code double} |
| * value. This reproduces the effect of {@code object.fieldName = value} |
| * <p> |
| * If this field is static, the object argument is ignored. |
| * Otherwise, if the object is {@code null}, a NullPointerException is |
| * thrown. If the object is not an instance of the declaring class of the |
| * method, an IllegalArgumentException is thrown. |
| * <p> |
| * If this Field object is enforcing access control (see AccessibleObject) |
| * and this field is not accessible from the current context, an |
| * IllegalAccessException is thrown. |
| * <p> |
| * If the value cannot be converted to the field type via a widening |
| * conversion, an IllegalArgumentException is thrown. |
| * |
| * @param object |
| * the object to access |
| * @param value |
| * the new value |
| * @throws NullPointerException |
| * if the object is {@code null} and the field is non-static |
| * @throws IllegalArgumentException |
| * if the object is not compatible with the declaring class |
| * @throws IllegalAccessException |
| * if this field is not accessible |
| */ |
| public void setDouble(Object object, double value) throws IllegalAccessException, |
| IllegalArgumentException { |
| setDField(object, declaringClass, type, slot, flag, TYPE_DOUBLE, value); |
| } |
| |
| /** |
| * Sets the value of the field in the specified object to the {@code float} |
| * value. This reproduces the effect of {@code object.fieldName = value} |
| * <p> |
| * If this field is static, the object argument is ignored. |
| * Otherwise, if the object is {@code null}, a NullPointerException is |
| * thrown. If the object is not an instance of the declaring class of the |
| * method, an IllegalArgumentException is thrown. |
| * <p> |
| * If this Field object is enforcing access control (see AccessibleObject) |
| * and this field is not accessible from the current context, an |
| * IllegalAccessException is thrown. |
| * <p> |
| * If the value cannot be converted to the field type via a widening |
| * conversion, an IllegalArgumentException is thrown. |
| * |
| * @param object |
| * the object to access |
| * @param value |
| * the new value |
| * @throws NullPointerException |
| * if the object is {@code null} and the field is non-static |
| * @throws IllegalArgumentException |
| * if the object is not compatible with the declaring class |
| * @throws IllegalAccessException |
| * if this field is not accessible |
| */ |
| public void setFloat(Object object, float value) throws IllegalAccessException, |
| IllegalArgumentException { |
| setFField(object, declaringClass, type, slot, flag, TYPE_FLOAT, value); |
| } |
| |
| /** |
| * Set the value of the field in the specified object to the {@code int} |
| * value. This reproduces the effect of {@code object.fieldName = value} |
| * <p> |
| * If this field is static, the object argument is ignored. |
| * Otherwise, if the object is {@code null}, a NullPointerException is |
| * thrown. If the object is not an instance of the declaring class of the |
| * method, an IllegalArgumentException is thrown. |
| * <p> |
| * If this Field object is enforcing access control (see AccessibleObject) |
| * and this field is not accessible from the current context, an |
| * IllegalAccessException is thrown. |
| * <p> |
| * If the value cannot be converted to the field type via a widening |
| * conversion, an IllegalArgumentException is thrown. |
| * |
| * @param object |
| * the object to access |
| * @param value |
| * the new value |
| * @throws NullPointerException |
| * if the object is {@code null} and the field is non-static |
| * @throws IllegalArgumentException |
| * if the object is not compatible with the declaring class |
| * @throws IllegalAccessException |
| * if this field is not accessible |
| */ |
| public void setInt(Object object, int value) throws IllegalAccessException, |
| IllegalArgumentException { |
| setIField(object, declaringClass, type, slot, flag, TYPE_INTEGER, value); |
| } |
| |
| /** |
| * Sets the value of the field in the specified object to the {@code long} |
| * value. This reproduces the effect of {@code object.fieldName = value} |
| * <p> |
| * If this field is static, the object argument is ignored. |
| * Otherwise, if the object is {@code null}, a NullPointerException is |
| * thrown. If the object is not an instance of the declaring class of the |
| * method, an IllegalArgumentException is thrown. |
| * <p> |
| * If this Field object is enforcing access control (see AccessibleObject) |
| * and this field is not accessible from the current context, an |
| * IllegalAccessException is thrown. |
| * <p> |
| * If the value cannot be converted to the field type via a widening |
| * conversion, an IllegalArgumentException is thrown. |
| * |
| * @param object |
| * the object to access |
| * @param value |
| * the new value |
| * @throws NullPointerException |
| * if the object is {@code null} and the field is non-static |
| * @throws IllegalArgumentException |
| * if the object is not compatible with the declaring class |
| * @throws IllegalAccessException |
| * if this field is not accessible |
| */ |
| public void setLong(Object object, long value) throws IllegalAccessException, |
| IllegalArgumentException { |
| setJField(object, declaringClass, type, slot, flag, TYPE_LONG, value); |
| } |
| |
| /** |
| * Sets the value of the field in the specified object to the {@code short} |
| * value. This reproduces the effect of {@code object.fieldName = value} |
| * <p> |
| * If this field is static, the object argument is ignored. |
| * Otherwise, if the object is {@code null}, a NullPointerException is |
| * thrown. If the object is not an instance of the declaring class of the |
| * method, an IllegalArgumentException is thrown. |
| * <p> |
| * If this Field object is enforcing access control (see AccessibleObject) |
| * and this field is not accessible from the current context, an |
| * IllegalAccessException is thrown. |
| * <p> |
| * If the value cannot be converted to the field type via a widening |
| * conversion, an IllegalArgumentException is thrown. |
| * |
| * @param object |
| * the object to access |
| * @param value |
| * the new value |
| * @throws NullPointerException |
| * if the object is {@code null} and the field is non-static |
| * @throws IllegalArgumentException |
| * if the object is not compatible with the declaring class |
| * @throws IllegalAccessException |
| * if this field is not accessible |
| */ |
| public void setShort(Object object, short value) throws IllegalAccessException, |
| IllegalArgumentException { |
| setSField(object, declaringClass, type, slot, flag, TYPE_SHORT, value); |
| } |
| |
| /** |
| * Returns a string containing a concise, human-readable description of this |
| * field. |
| * <p> |
| * The format of the string is: |
| * <ol> |
| * <li>modifiers (if any) |
| * <li>type |
| * <li>declaring class name |
| * <li>'.' |
| * <li>field name |
| * </ol> |
| * <p> |
| * For example: {@code public static java.io.InputStream |
| * java.lang.System.in} |
| * |
| * @return a printable representation for this field |
| */ |
| @Override |
| public String toString() { |
| StringBuilder result = new StringBuilder(Modifier.toString(getModifiers())); |
| if (result.length() != 0) { |
| result.append(' '); |
| } |
| appendTypeName(result, type); |
| result.append(' '); |
| appendTypeName(result, declaringClass); |
| result.append('.'); |
| result.append(name); |
| return result.toString(); |
| } |
| |
| private native Object getField(Object o, Class<?> declaringClass, Class<?> type, int slot, |
| boolean noAccessCheck) throws IllegalAccessException; |
| |
| private native double getDField(Object o, Class<?> declaringClass, Class<?> type, int slot, |
| boolean noAccessCheck, char descriptor) throws IllegalAccessException; |
| |
| private native int getIField(Object o, Class<?> declaringClass, Class<?> type, int slot, |
| boolean noAccessCheck, char descriptor) throws IllegalAccessException; |
| |
| private native long getJField(Object o, Class<?> declaringClass, Class<?> type, int slot, |
| boolean noAccessCheck, char descriptor) throws IllegalAccessException; |
| |
| private native boolean getZField(Object o, Class<?> declaringClass, Class<?> type, int slot, |
| boolean noAccessCheck, char descriptor) throws IllegalAccessException; |
| |
| private native float getFField(Object o, Class<?> declaringClass, Class<?> type, int slot, |
| boolean noAccessCheck, char descriptor) throws IllegalAccessException; |
| |
| private native char getCField(Object o, Class<?> declaringClass, Class<?> type, int slot, |
| boolean noAccessCheck, char descriptor) throws IllegalAccessException; |
| |
| private native short getSField(Object o, Class<?> declaringClass, Class<?> type, int slot, |
| boolean noAccessCheck, char descriptor) throws IllegalAccessException; |
| |
| private native byte getBField(Object o, Class<?> declaringClass, Class<?> type, int slot, |
| boolean noAccessCheck, char descriptor) throws IllegalAccessException; |
| |
| private native void setField(Object o, Class<?> declaringClass, Class<?> type, int slot, |
| boolean noAccessCheck, Object value) throws IllegalAccessException; |
| |
| private native void setDField(Object o, Class<?> declaringClass, Class<?> type, int slot, |
| boolean noAccessCheck, char descriptor, double v) throws IllegalAccessException; |
| |
| private native void setIField(Object o, Class<?> declaringClass, Class<?> type, int slot, |
| boolean noAccessCheck, char descriptor, int i) throws IllegalAccessException; |
| |
| private native void setJField(Object o, Class<?> declaringClass, Class<?> type, int slot, |
| boolean noAccessCheck, char descriptor, long j) throws IllegalAccessException; |
| |
| private native void setZField(Object o, Class<?> declaringClass, Class<?> type, int slot, |
| boolean noAccessCheck, char descriptor, boolean z) throws IllegalAccessException; |
| |
| private native void setFField(Object o, Class<?> declaringClass, Class<?> type, int slot, |
| boolean noAccessCheck, char descriptor, float f) throws IllegalAccessException; |
| |
| private native void setCField(Object o, Class<?> declaringClass, Class<?> type, int slot, |
| boolean noAccessCheck, char descriptor, char c) throws IllegalAccessException; |
| |
| private native void setSField(Object o, Class<?> declaringClass, Class<?> type, int slot, |
| boolean noAccessCheck, char descriptor, short s) throws IllegalAccessException; |
| |
| private native void setBField(Object o, Class<?> declaringClass, Class<?> type, int slot, |
| boolean noAccessCheck, char descriptor, byte b) throws IllegalAccessException; |
| |
| } |