Java通过反射获取Field属性字段
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java通过反射获取Field属性字段,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3198字,纯文字阅读大概需要5分钟。
内容图文
-
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(); } }
内容总结
以上是互联网集市为您收集整理的Java通过反射获取Field属性字段全部内容,希望文章能够帮你解决Java通过反射获取Field属性字段所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。