java之反射(2)属性field
头条创作挑战赛
通过反射可以得到字节码文件中的信息,比如字节码中的属性、方法、构造器等,是与类对应的。
今天学习属性field的一些api。设置一个User类,内容如下:publicclassUser{publicintnum;privatedoublehight;protectedStringcname;staticbooleansex;privatestaticintage;}一、反射属性
先获取字节码文件:ClasscUserClass。forName(org。example。dao。User);
getFields获取公开的属性,即带有public的Field〔〕fieldscUser。getFields();for(Fieldf:fields){System。out。println(f);}输出:publicintorg。example。dao。User。num
getDeclaredFields()获取所有的属性,无论是私有的还是公开的还是受保护的。返回的是一个field的数组。Field〔〕declaredFieldscUser。getDeclaredFields();for(Fielditem:declaredFields){System。out。println(获取属性全名:item);}
输出结果:获取属性全名:publicintorg。example。dao。User。num
获取属性全名:privatedoubleorg。example。dao。User。hight
获取属性全名:protectedjava。lang。Stringorg。example。dao。User。cname
获取属性全名:staticbooleanorg。example。dao。User。sex
获取属性全名:privatestaticintorg。example。dao。User。age
获取属性全名:floatorg。example。dao。User。kg
如果你不想输出这么长的名字,可以用getName()获取短名。Field〔〕declaredFieldscUser。getDeclaredFields();for(Fielditem:declaredFields){System。out。println(获取属性简名:item。getName());}
输出结果:获取属性简名:num
获取属性简名:hight
获取属性简名:cname
获取属性简名:sex
获取属性简名:age
获取属性简名:kg
获取类型名Field〔〕declaredFieldscUser。getDeclaredFields();for(Fielditem:declaredFields){System。out。println(获取属性类型:item。getType());}
输出结果:获取属性类型:int
获取属性类型:double
获取属性类型:classjava。lang。String
获取属性类型:boolean
获取属性类型:int
获取属性类型:float
获取属性修饰符Field〔〕declaredFieldscUser。getDeclaredFields();for(Fielditem:declaredFields){System。out。println(获取修饰符编号:item。getModifiers());}
输出结果:获取修饰符编号:1获取修饰符编号:2获取修饰符编号:4获取修饰符编号:8获取修饰符编号:10获取修饰符编号:0
输出的是一堆修饰符编号,什么都不加是0,public是1,private是2,protected是4,static是8,final是16;可以用Modifier。toString()进行转换。Field〔〕declaredFieldscUser。getDeclaredFields();for(Fielditem:declaredFields){System。out。println(获取修饰符名字:Modifier。toString(item。getModifiers()));}
输出结果:获取修饰符名字:public
获取修饰符名字:private
获取修饰符名字:protected
获取修饰符名字:static
获取修饰符名字:privatestatic
获取修饰符名字:
二、类属性的获取:ClasscUserClass。forName(org。example。dao。User);System。out。println(获取字节码文件全名:cUser。getName());System。out。println(获取字节码文件简单名:cUser。getSimpleName());System。out。println(获取字节码文件修饰符:Modifier。toString(cUser。getModifiers()));
结果:获取字节码文件全名:org。example。dao。User
获取字节码文件简单名:User
获取字节码文件修饰符:public
解析:
getName():是获取类的全限定名
getSimpleName():获取类的简单名字
三、以实例对象的方式设置属性值
用newInstance创建实例对象,publicclassClient{publicstaticvoidmain(String〔〕args)throwsException{ClasscUserClass。forName(org。example。dao。User);Userobj(User)cUser。newInstance();ObjectobjcUser。newInstance();}}
用getDeclaredField获取单个的属性,这里不是getDeclaredFields哈,少了个s。publicclassClient{publicstaticvoidmain(String〔〕args)throwsException{ClasscUserClass。forName(org。example。dao。User);Userobj(User)cUser。newInstance();ObjectobjcUser。newInstance();FieldhightcUser。getDeclaredField(hight);}}
获取到属性后,给hight赋值,用hight。set(obj,178);
hight:是要赋值的属性。
set:设置
obj:是给那个对象赋值
178:要设的属性值publicclassClient{publicstaticvoidmain(String〔〕args)throwsException{ClasscUserClass。forName(org。example。dao。User);Userobj(User)cUser。newInstance();ObjectobjcUser。newInstance();FieldhightcUser。getDeclaredField(hight);hight。set(obj,178);}}
此时运行一下,发现报错了:
这是因为hight属性是一个私有的,不能设置属性值。
怎么办呢?可以用setAccessible(true);进行强制赋值。publicclassClient{publicstaticvoidmain(String〔〕args)throwsException{ClasscUserClass。forName(org。example。dao。User);Userobj(User)cUser。newInstance();ObjectobjcUser。newInstance();FieldhightcUser。getDeclaredField(hight);hight。setAccessible(true);hight。set(obj,178);}}
强制赋值之后就可以了,那我们怎么查看赋值的结果呢?
用hight。get(obj)查看结果:
hight:是要查看的属性
get:查询
obj:查询那个对象的属性值。publicclassClient{publicstaticvoidmain(String〔〕args)throwsException{ClasscUserClass。forName(org。example。dao。User);Userobj(User)cUser。newInstance();ObjectobjcUser。newInstance();FieldhightcUser。getDeclaredField(hight);System。out。println(hight。getName());hight。setAccessible(true);hight。set(obj,178);System。out。println(hight。get(obj));}}
黑枸杞有什么功效?有何依据?黑枸杞即黑果枸杞,黑果枸杞蒙名为乔诺英mdash哈尔马格藏药名旁玛,属于茄科枸杞属。黑枸杞呈深黑色,干果易碎,野生黑枸杞味甘性平,富含蛋白质脂肪糖类游离氨基酸有机酸矿物质微量元素生
心脏复查做什么检查好?心脏疾病是一大类疾病的总称,对于心脏疾病的复查项目,主要与我们具体疾病类型有关,不能一概而论,所以我们应听从专业医生指导,根据病情制定具体的复查时间和复查项目,以最大程度的了解疾病
28岁男生,欠网贷与信用卡近30w,全部逾期了,工资也不够月供,该怎么办?我的情况比你糟糕多了,银行信用卡,贷款,网贷还有亲戚朋友的债共计132万,现在已经全面逾期,强制上岸了,快两年了,说说我的经历,也许对你有所帮助。先来说说我是怎么欠下这么多债的本人
短线炒股什么方法最好?短线炒股什么方法好?我认为散户最好不要短线炒股,因为散户短线亏损的概率要大于90以上。一短线准确率等于抛硬币其实,股票短线预测成功的概率,和抛硬币是差不多,大概只有50。即使这样,
项目部正在招聘,45岁的嫌没有学历及证书25岁的嫌没有经验,证书和经验哪个重要?项目在招聘那招建造师的可能性不大,无非就是招项目总工,项目技术负责人,资料员,安全员,预算员之类的。在这种情况下能招聘到有学历又有经验的那当然最好,但这样的人员现在很难招到,大多数
你觉得每个月收入多少才够你的生活开销?多少钱够生活,这个问题取决于你在哪个城市,有房没房等多方面原因。而且生活和生存也是有区别的,生存是可以有地方住,有东西果腹。生活就涉及到社交兴趣爱好衣食住行各个方面。其实生活成本的
如果孩子从怀孕到出生到成长教育全是国家出钱,你会生几个小孩?我就生两个,不管男孩女孩,孩子有个伴就可以了,我们那个年代,我爸妈就生了我和弟弟,生活条件就是比生四五个的过得好,一个苹果俩人分,和一个苹果五个人分是有差别的,而且照顾孩子也有精力
宝宝什么时候开始翻身?宝宝什么时候开始翻身?宝宝从3个多月开始出现翻身行为,开始时可以由仰卧位翻身至侧卧位,6个月以后,可以从仰卧位翻至俯卧位,再从俯卧位翻至仰卧位。如果6个月后仍不会翻身,应及时带宝宝
浙江改名最牛的景区千岛湖,并列世界第三,为何有的自驾游客称不再来?谢邀!为什么许多游客来过千岛湖不想再来!我以为有以下几点1景区性价比不高。前些年借开会去过一趟千岛湖,说实在的没有什么印象。2017年带家人江南踏青之旅,途经必选千岛湖而且也做为重
汽车遥控钥匙电池正常能用多长时间?汽车钥匙随着汽车科技的发展,功能是越来越多了。但是时间久了钥匙突然没电,让人着急。今天我们就来讲讲钥匙的寿命和没电时如何应急处理。一车钥匙能用多久一般遥控钥匙电池寿命是在23年,根
你来武汉旅游印象最深的是什么地方?我去武汉旅游印象最深的?1。武汉面积我在广州都没有这么大的感触,我是自由行到了武汉随机走,查到一个地方就去一个地方,基本上都是一个小时一个半小时路程,不论是公交还是打的。离开去动车