Field

UML图

测试类

public class ClassA<E> {
    private String name = "dengyi";

    public static Integer age = 28;

    public List<E> list = new ArrayList<>();

}

方法摘要

  • isEnumConstant(): 检测成员是否是枚举的常量
  • getType(): 返回一个Class对象,它标识了此Field对象所表示字段的声明类型: 如java.util.List的class对象
  • getGenericType(): 返回带泛型的声明类型如: java.util.List<E>

  • toString(): public java.util.List com.jianglei.field.ClassA.list
  • toGenericString() public java.util.List<E> com.jianglei.field.ClassA.list

  • get(Object obj)

如果是基本类型 -> 返回包装类型
如果此字段是static,那么参数obj会被忽略,所也obj可以是null

public class ClassA<E> {
    private String name = "dengyi";

    public static Integer age = 28;

    public List<E> list = new ArrayList<>();


    public static void main(String[] args) throws 
        NoSuchFieldException, IllegalAccessException {

        Class<ClassA> cls = ClassA.class;
        Field age = cls.getDeclaredField("age");
        Object o = age.get(null);
        System.out.println(o);
    }

}

如果此字段不是static,那么其是一个实例字段。如果指定的obj为null,则会抛出一个NullPointerException。如果指定的obj不是此class的实例将会抛出IllegalArgumentException

public class ClassA<E> {
    private String name = "dengyi";

    public static Integer age = 28;

    public List<E> list = new ArrayList<>();


    public static void main(String[] args) throws 
                    NoSuchFieldException, IllegalAccessException {
        Class<ClassA> cls = ClassA.class;
        Field list = cls.getDeclaredField("list");
        list.get(null); //throw NullPointerException
        list.get(new Object()); //throw IllegalArgumentException
    }

}

如果此字段带有private等访问权限,说明此字段不可以被访问,此方法会抛出一个IllegalAccessException

public class ClassA<E> {
    private String name = "dengyi";

    public static Integer age = 28;

    public List<E> list = new ArrayList<>();

}

class ClassATest{
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        Class<ClassA> cls = ClassA.class;
        Field name = cls.getDeclaredField("name");
        name.get(new ClassA()); //throw IllegalAccessException

    }
}

最后,值会被从实例或静态字段中提取出来。如果字段是基本类型,将会包装成引用类型,否则原封不动的返回

public class ClassA<E> {
    private String name = "dengyi";

    //基本类型
    public static int age = 28;

    public List<E> list = new ArrayList<>();


    public static void main(String[] args) throws
                        NoSuchFieldException, IllegalAccessException {
        Class<ClassA> cls = ClassA.class;
        ClassA classA = new ClassA();

        Field age = cls.getField("age");
        Field list = cls.getField("list");

        Object o = age.get(classA);
        System.out.println(o instanceof Integer); //基本类型返回其包装类

        Object o1 = list.get(classA);
        System.out.println(o1 instanceof List); //引用类型原样返回

    }
}

  • set(Object obj, Object value)

这个方法的处理流程如下:

如果字段是静态的,obj字段会被忽略,obj字段可以为null

public class ClassA<E> {
    private String name = "dengyi";

    public static int age = 28;

    public List<E> list = new ArrayList<>();


    public static void main(String[] args) throws
                        NoSuchFieldException, IllegalAccessException {
        Class<ClassA> cls = ClassA.class;

        Field age = cls.getField("age");
        age.set(null, 18); //obj 参数可以为null
        System.out.println(ClassA.age); //output: 18

    }
}

否则此字段是一个实例的字段,如指定的obj参数为null,则会抛出一个NullPointerException。如果指定的obj参数不是此class的实例,则会抛出一个IllegalArgumentException

public class ClassA<E> {
    private String name = "dengyi";

    public static int age = 28;

    public List<E> list = new ArrayList<>();


    public static void main(String[] args) throws
                        NoSuchFieldException, IllegalAccessException {
        Class<ClassA> cls = ClassA.class;

        Field list = cls.getField("list");
        list.set(null, new ArrayList()); //throw NullPointerException

        list.set(new Object(), new ArrayList()); //throw IllegalArgumentException

    }
}

如果字段是Java的访问控制之后,且此字段是不可访问的,此方法会抛出一个IllgealAccessException

public class ClassA<E> {
    private String name = "dengyi";

    public static int age = 28;

    public List<E> list = new ArrayList<>();



}
class ClassATest{
    public static void main(String[] args) throws
            NoSuchFieldException, IllegalAccessException {
        Class<ClassA> cls = ClassA.class;

        Field name = cls.getDeclaredField("name");
        name.set(new ClassA(), "jianglei"); //throw IllegalAccessException

    }
}

如果此字段是final,此方法会抛出一个IllegalAccessException。除非调用setAccessible(true)且此字段是非静态的。在通过程序的其他部分可以访问类的实例之前,只有使用空白 final 字段反序列化或重构类的实例期间,以这种方式设置 final 字段才有意义

public class ClassA<E> {
    public final String name = "dengyi"; //字段为final

    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        Class<ClassA> cls = ClassA.class;
        Field name = cls.getField("name");

        ClassA classA = new ClassA();
        name.set(classA, "jianglei"); //throw IllegalAccessException
    }
}

如果底层字段的类型为某一基本类型,则可以尝试使用解包转换将新值转换为基本类型的值。如果该尝试失败,则此方法将抛出一个IllegalArgumentException

如果在进行可能的解包之后,无法通过某一标识或扩展转换将新值转换为底层字段的类型,则此方法将抛出一个IllegalArgumentException


  • 剩下的就是对八种基本类型的get 和 set 了,基本上和上面介绍的get 和 set 一样,这里就不作过多介绍了

results matching ""

    No results matching ""