有三个类,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对象,题主的问题完全使用反射。改造一下如下:
[code="java"]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));[/code]
[code="java"]
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 : eye000
nose : nose000
[/code]
楼上两个回复已经可以解决问题了。楼主如果要实现以后正确运用,建议还是从反射的这些API入手,详细了解下,比如
[code="java"]
getDeclaredField()
getDeclaredMethods()
getFields()
[/code]
可以获取到相应的对象的Class的对象之后,遍历一下这些方法的返回值,大概会更清楚些。