public class searchProperty {
/*getField和getDeclaredField的区别
这两个方法都是用于获取字段
getField 只能获取public的,包括从父类继承来的字段。
getDeclaredField 可以获取本类所有的字段,包括private的,但是不能获取继承来的字段。
(注: 这里只能获取到private的字段,但并不能访问该private字段的值,除非加上setAccessible(true))*/
public static void main(String[] args) {
//获取类Hero的名字叫做name的字段
String s = "com.dgut.reflect.Hero";
try {
Class c = Class.forName(s);
Constructor constructor = c.getConstructor();
Hero hero = (Hero)constructor.newInstance();
Field f1=c.getDeclaredField("name");
// Field f1=c.getField("name");这个无法获取当name被private修饰的情况
// f1.setAccessible(true); 这一段代码是使类对象中的private修饰的name能够被访问修改,没有这个则无法修改,只能获取字段
System.out.println(f1);
//f1.set(hero, "teemo"); //修改这个字段的值,需要setAccessible(true)
//打印被修改后的值
System.out.println(hero.getName());
} catch (ClassNotFoundException | NoSuchFieldException | IllegalAccessException | NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
}
Hero类就是随便的一个类,有一个name属性,用private或者public修饰都无所谓,都只是测试getDeclaredField和getField的区别。
getDeclaredField可以查到找private修饰的属性,而getField无法查找到。
虽然getDeclaredField可以查找到private修饰的属性,但是不可以去修改它的值,必须要setAccessible(true)才可以通过getDeclaredField找到它的值