问题描述
有三个类,Human,Head,Body,请问如何用反射获取Human中的Head中的属性(eye,nose)?如下:public class Human {private Head head;private Body body;public Head getHead() {return head;}public void setHead(Head head) {this.head = head;}public Body getBody() {return body;}public void setBody(Body body) {this.body = body;}} public class Head {private String eye;private String nose;public String getEye() {return eye;}public void setEye(String eye) {this.eye = eye;}public String getNose() {return nose;}public void setNose(String nose) {this.nose = nose;}} public class Body {private String arm;private String leg;public String getArm() {return arm;}public void setArm(String arm) {this.arm = arm;}public String getLeg() {return leg;}public void setLeg(String leg) {this.leg = leg;}}
解决方案
楼上不是完全的反射,因为楼上直接调用了human.getHead()方法取到了Head对象,题主的问题完全使用反射。改造一下如下:Class<?> humanClazz = human.getClass();Field headField = humanClazz.getDeclaredField("head");Class<?> headClazz = headField.getType();Field eyeField = headClazz.getDeclaredField("eye");Field noseField = headClazz.getDeclaredField("nose");eyeField.setAccessible(true);noseField.setAccessible(true);headField.setAccessible(true);Object head = headField.get(human);System.out.println(eyeField.getName() + " : " + eyeField.get(head));System.out.println(noseField.getName() + " : " + noseField.get(head));
解决方案二:
楼上两个回复已经可以解决问题了。楼主如果要实现以后正确运用,建议还是从反射的这些API入手,详细了解下,比如getDeclaredField()getDeclaredMethods()getFields()可以获取到相应的对象的Class的对象之后,遍历一下这些方法的返回值,大概会更清楚些。
解决方案三:
Head head = new Head();head.setEye("eye000");head.setNose("nose000");Body body = new Body();body.setArm("arm000");body.setLeg("leg000");Human human = new Human();human.setHead(head);human.setBody(body);Class<?> humanClazz = human.getClass();Field headField = humanClazz.getDeclaredField("head");Class<?> headClazz = headField.getType();Field eyeField = headClazz.getDeclaredField("eye");Field noseField = headClazz.getDeclaredField("nose");eyeField.setAccessible(true);noseField.setAccessible(true);System.out.println(eyeField.getName() + " : " + eyeField.get(human.getHead()));System.out.println(noseField.getName() + " : " + noseField.get(human.getHead()));显示结果为:eye : eye000nose : nose000