java.lang.reflect.Field API 简介

 

package chapter.lang.reflect;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

/**
 * 提供有关类或接口的单个字段的信息和动态访问。
 * 反射的字段可以是类(静态)字段或实例字段。
 */
public class FieldDemo {
    public static Logger logger = LoggerFactory.getLogger(FieldDemo.class);

    public static final String CLASSNAME = "ZHX";
    private static final int CLASSSAGE = 20;

    public String name;
    private int age;
    public FieldDemo next;

    public FieldDemo(){

    }

    public FieldDemo(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        final StringBuffer sb = new StringBuffer("FieldDemo{");
        sb.append("name='").append(name).append('\'');
        sb.append(", age=").append(age);
        sb.append(", next=").append(next);
        sb.append('}');
        return sb.toString();
    }


    // 1. 名字相关
    /**
     * 返回由此 Field对象表示的字段的名称。
     * String	getName()
     *
     * 返回描述此 Field的字符串,包括其通用类型。
     * String	toGenericString()
     *
     * 返回一个描述这个 Field的字符串。
     * String	toString()
     */

    //2. 设置值
    /**
     * 将指定对象参数上的此 Field对象表示的字段设置为指定的新值。
     * void	set(Object obj, Object value)
     *
     * 设置作为一个字段的值 boolean指定的对象上。
     * void	setBoolean(Object obj, boolean z)
     *
     * 设置作为一个字段的值 byte指定的对象上。
     * void	setByte(Object obj, byte b)
     *
     * 设置作为一个字段的值 char指定的对象上。
     * void	setChar(Object obj, char c)
     *
     * 设置作为一个字段的值 double指定的对象上。
     * void	setDouble(Object obj, double d)
     *
     * 设置作为一个字段的值 float指定的对象上。
     * void	setFloat(Object obj, float f)
     *
     * 设置作为一个字段的值 int指定的对象上。
     * void	setInt(Object obj, int i)
     *
     * 设置作为一个字段的值 long指定的对象上。
     * void	setLong(Object obj, long l)
     *
     * 设置作为一个字段的值 short指定的对象上。
     * void	setShort(Object obj, short s)
     *
     */

    // 3. 取值函数
    /**
     * 返回该所表示的字段的值 Field ,指定的对象上。
     * Object	get(Object obj)
     *
     * 获取静态或实例的值 boolean字段。
     * boolean	getBoolean(Object obj)
     *
     * 获取静态或实例的值 byte字段。
     * byte	getByte(Object obj)
     *
     * 获取类型为 char的静态或实例字段的值,或通过扩大转换获得可转换为类型 char的另一个原始类型的值。
     * char	getChar(Object obj)
     *
     * 获取类型为 double的静态或实例字段的值,或通过扩展转换转换为类型 double的另一个基本类型的值。
     * double	getDouble(Object obj)
     *
     * 获取类型为 float的静态或实例字段的值,或通过加宽转换转换为类型 float的另一个基本类型的值。
     * float	getFloat(Object obj)
     *
     * 获取类型为 int的静态或实例字段的值,或通过扩展转换转换为类型 int的另一个原始类型的值。
     * int	getInt(Object obj)
     *
     * 获取类型为 long的静态或实例字段的值,或通过扩大转换获得可转换为类型 long的另一个基本类型的值。
     * long	getLong(Object obj)
     *
     * 获取类型为 short的静态或实例字段的值,或通过加宽转换转换为类型 short的另一个基本类型的值。
     * short	getShort(Object obj)
     *
     */

    // 4. 描述符号
    /**
     * int	getModifiers()
     * 返回由该 Field对象表示的字段的Java语言修饰符,作为整数。
     */

    // 5. 数据类型
    /**
     * 返回一个 Type对象,它表示由该表示的字段的声明类型 Field对象。
     * Type	getGenericType()
     *
     * 返回一个 类对象标识了此表示的字段的声明类型 Field对象。
     * Class<?>	getType()
     *
     * 返回一个AnnotatedType对象,该对象表示使用类型来指定此Field所表示的字段的声明类型。
     * AnnotatedType	getAnnotatedType()
     *
     */

    // 6. 类
    /**
     * 返回表示 类对象表示的字段的类或接口的 Field对象。
     * Class<?>	getDeclaringClass()
     */

    // 7. 字段上的注解
    /**
     * 返回该元素的,如果这样的注释 ,否则返回null指定类型的注释。
     * <T extends Annotation> T	getAnnotation(类<T> annotationClass)
     *
     * 返回与此元素相关联的注释 。
     * <T extends Annotation> T[]	getAnnotationsByType(Class<T> annotationClass)
     *
     * 返回 直接存在于此元素上的注释。
     * Annotation[]	getDeclaredAnnotations()
     *
     */

    // 8. 其他
    /**
     * 如果此字段表示枚举类型的元素,则返回true ; 返回false其他。
     * boolean	isEnumConstant()
     *
     * 如果此字段是合成字段,则返回true ; 返回false其他。
     * boolean	isSynthetic()
     *
     */


    public static void main(String[] args) throws IllegalAccessException, NoSuchFieldException {
        FieldDemo demo = new FieldDemo("zhx",25);
        System.out.println(demo);
        Field[] fields = demo.getClass().getDeclaredFields();
        //fields = String.class.getDeclaredFields();

        for(Field field : fields){
            logger.info("{} {} {} ", Modifier.toString(field.getModifiers()),field.getType().getName(),field.getName());
        }
        for(Field field : fields){
            logger.info("{} ", field.toGenericString());
        }

        logger.info(">>>>>>>>>>>>>>");
        Field f = demo.getClass().getDeclaredField("age");
        f.setInt(demo,100);
        logger.info("设置年龄后 = {}",demo.toString());

        f = demo.getClass().getDeclaredField("name");
        Object o = f.get(demo);
        System.out.println(o.getClass().getCanonicalName() + ":" + o.toString());
        f = demo.getClass().getDeclaredField("age");
        int anInt = f.getInt(demo);
        System.out.println(anInt);
    }

}