GFather祖先类
package reflection.second; public class GFather { public int g_age = 1; public String g_name = "爷爷"; public GFather(){ } }
Father父类,并且继承GFather类
package reflection.second; public class Father extends GFather{ private int father_age; public String father_name; public Father(){ } public Father(int father_age, String father_name) { this.father_age = father_age; this.father_name = father_name; } }
Son子类,并且继承Father类。
package reflection.second; public class Son extends Father { private int son_age; public String son_name; public Son(){ } public Son(int age, String name) { super(); this.son_age = age; this.son_name = name; } }
Java一共提供了四种方法接口获取字段,如果权限不够可以使用setAccessible(true)临时将修饰符改为public,这样就可以取到值。
4.1、getDeclaredField(String name)通过name来获取本类定义的字段; 所有祖先类的属性字段都是无法获取到的。
@Test public void test1(){ /* 1. getDeclaredField(String name) 只能获取本类所有的属性字段 祖先类的字段都无法获取 */ Son son = new Son(3,"儿子",2,"爸爸"); try{ Field f1 = Class.forName("reflection.second.Son").getDeclaredField("s_age"); f1.setAccessible(true); System.out.println(f1.getName() + " -> " + f1.get(son)); Field f2 = Class.forName("reflection.second.Son").getDeclaredField("f_age"); //权限不够 f2.setAccessible(true); System.out.println(f2.getName() + " -> " + f2.get(son)); Field f3 = Class.forName("reflection.second.Son").getDeclaredField("g_age"); //权限不够 f3.setAccessible(true); System.out.println(f3.getName() + " -> " + f3.get(son)); } catch (Exception e){ e.printStackTrace(); } }
4.2、getField(String name)通过name指定获取本类 + 祖先类的public字段;但是仅限于public属性字段,所有的非public属性字段是无法获取到的包括本类。
@Test public void test2(){ /* 2. 只能获取本类 + 祖先类的public方法 */ Son son = new Son(3,"儿子",2,"爸爸"); try{ Field f1 = Class.forName("reflection.second.Son").getField("s_name"); Field f2 = Class.forName("reflection.second.Son").getField("f_name"); Field f3 = Class.forName("reflection.second.Son").getField("g_name"); System.out.println(f1.getName() + ": " + f1.get(son)); System.out.println(f2.getName() + ": " + f2.get(son)); System.out.println(f3.getName() + ": " + f3.get(son)); Field f4 = Class.forName("reflection.second.Son").getField("s_age"); //无法获取 f4.setAccessible(true); System.out.println(f4.getName() + ": " + f4.get(son)); } catch (Exception e){ e.printStackTrace(); } }
4.3、getDeclaredFields() 获取本类定义所有的字段,使用时记得临时提升属性字段的权限,否则会报出异常。
@Test public void test3(){ /* 3. 获取本类所有的属性字段。 注意提升权限,否则会报错说权限不够 */ try { Son son = new Son(3, "儿子", 2, "爸爸"); Field[] fields = Class.forName("reflection.second.Son").getDeclaredFields(); for (Field f : fields) { f.setAccessible(true); System.out.println(f.getName() + " -> " + f.get(son)); } }catch (Exception e) { e.printStackTrace(); } }
4.4、getFields() 获取本类 + 祖先类所有的public字段;
@Test public void test4(){ /* 4. 获取本类 + 祖先类所有的public属性字段 */ try{ Son son = new Son(3, "儿子", 2, "爸爸"); Field[] SumFields = Class.forName("reflection.second.Son").getFields(); for(Field f : SumFields){ System.out.println(f.getName() + " -> " + f.get(son)); } }catch (Exception e){ e.printStackTrace(); } }