Field,Method,Constructor java 7 Reflection(三)

Technorati 标记: Field,Method,Constructor,java

    承接前篇对java Reflection的介绍 :

    Class对象的获取 , 详细讲解了四种获取Class对象的方法;

    获取class对象信息 , 详细讲解了如果获取class对象的信息,包括class对象的信息,class对象的成员信息。class对象的信息主要有修饰符,泛型参数,所实现的接口,继承的路径与及注解信息。class对象的成员信息主要有成员变量field,函数方法与构造器。

    这一接将继续探讨如何操纵Member。java Reflection 定义了一个接口Member,而它的实现就包括了Field、Method、Constructor。这一次将探讨如何如何使用这三个实现和其相关的API;

一、Field

    field包括了类型(type)和值(value)。Field提供提供相关的方法访问field类型和获取/设置filed的值。

    (1)访问field的类型

    曾经谈过,在java里,一个field要不就是8种基本的数据类型之一,要不就是一个引用。基本数据类型(boolean,byte,short,int,float,long,double,char);“引用”指的就是直接或者间接继承Object的类,同时还包括了接口(interface)、数组(arrays)、枚举(enum)。下面给出一个Demo,FieldDemo,演示如何获取field的类型。

public class FieldDemo<T> {public int id = 1;public String name = "TianYa";public double[] d;public List<Object> lo;public T val;main(String[] args) throws Exception{Class<?> c = FieldDemo.class;Field field = c.getField("id");out.println("field 类型 " + field.getType());out.println("field 泛型:" + field.getGenericType());;}}

    使用field.getType()即可获取field类型,类似的field.getGenericType()可获取field的泛型类型,不同的是,当field不具有泛型参数时,getGenericType()会返回其field类型。以下是部分输出:

    大致的输出应该没有太多的疑问,在这里还要注意一下,“T”输出的field类型:Object,这是因为java 泛型的类型擦出导致的—在编译的时候不包含泛型信息,泛型类型信息将在编译处理是被擦除,这个过程即类型擦除。可以查阅相关资料,了解更多类型擦除的信息。

    在这里,可能还会有一个疑问,就是在FieldDemo里的field都是public的,那是否可以为private的??当然是可以的,可以使用filed.getDeclaredField(String name)获取,,private修饰的field,更多的信息可以参考获取class对象信息。

    (2)获取/设置field值

    对于一个实例对象,可以通过反射来设置其值。在非必要的情况下,尽量不要使用反射来设置对象的值,因为这违反类的设计原则(封装性)。不过若你想深入了解java,反射是必须掌握的基础,因为其在各种架构里都会用到。

    Field对象提供了如下两组方法读取或设置Field值。

getXxx(Object obj):获取obj对象该字段的属性值。此处的Xxx对象8个基本类型,如果该属性是引用类型,则取消get后面的Xxx。 setXxx(Object obj, Xxx val):将obj对象该字段设置成val值。此处的Xxx对象8个基本类型,如果该属性是引用类型,则取消set后面的Xxx。

    在修改一些private field、没有访问权限或者final的field时,需要调用setAccessible(true)方法取消java语言的访问权限检查,否则会抛出IllegalAccessException。

    Demo People演示了如何去修改基本数据类型,数组,枚举的值。

enum Sex{MALE,FEMALE}public class People {private int id = 1;private String name = "zhang san";private Sex sex = Sex.MALE;private String[] friends = {"李四","王五"};main(String[] args) throws Exception{People p = new People();Class<?> c = p.getClass();//——————————-Field Id = c.getDeclaredField("id");System.out.println("id原来的值:" + p.id);Id.setInt(p, 2);System.out.println("id改动后的值:" + p.id);//———————————Field gender = c.getDeclaredField("sex");System.out.println("sex原来的值:" + p.sex);gender.set(p, Sex.FEMALE);System.out.println("sex改动后的值:" + p.sex);//———————————-Field fri = c.getDeclaredField("friends");System.out.println("friends原来的值:" + Arrays.asList(p.friends));String[] newFriends = {"赵六","小七"};fri.set(p, newFriends);System.out.println("friends改动后的值:" + Arrays.asList(p.friends));}}

    其输出如下:

如果爱,请深爱;如不爱,请离开。

Field,Method,Constructor java 7 Reflection(三)

相关文章:

你感兴趣的文章:

标签云: