这期讲讲反射机制如何获取类的属性,类的属性对应Field类(java.lang.reflect.Field),主要有如下四种方法:
1.Field getField(String name)
该方法返回某Class对象对应的类的名称为name的且以public修饰的属性
2.Fiele getDeclaredField(String name)
该方法返回某CLass对象对应的类的名称为name的属性,与权限修饰符无关
3.Field[] getFields()
该方法返回某Class对象对应的类的public的所有属性数组
4.Field[] getDeclaredFields()
该方法返回某Class对象对应的类的全部属性,与权限修饰符无关
使用Field类还可以获取和设置某个对象的属性值
1.获取某个对象的属性值 getXxx(Object obj)
获取obj对象对应的Field的属性值,这里的Xxx为八种基本数据类型,若是引用类型(如String),就不必加Xxx,直接get。若是私有的属性,需要使用setAccessbile(true)方法打开访问权限
2.设置某个对象对应的属性值setXxx(Object obj, param)
Xxx表示八种基本数据类型,若是引用类型,就去掉XXX。obj为要修改属性的对象,param为属性值。若是私有的属性,需要使用setAccessbile(true)方法打开访问权限
Employee emp = new Employee();
Class cla = Employee.class;
try {
//若使用getField方法就会抛出异常,因为name是私有属性,而getField只能获得共有属性
Field name = cla.getDeclaredField("name");
name.setAccessible(true);
name.set(emp, "李建国");
Field salary = cla.getDeclaredField("salary");
salary.setAccessible(true);
salary.setDouble(emp, 100);
//输出李建国 100.0
System.out.println(name.get(emp) + " " + salary.getDouble(emp));
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}