关于JAVA反射的一个问题

问题描述

有三个类,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

时间: 2024-07-30 15:27:17

关于JAVA反射的一个问题的相关文章

请王老师解答下java反射的一个问题

问题描述 请王老师解答下,谢谢. 解决方案 解决方案二:王老师这些年在捞偏门,整起了python!解决方案三:王老师,组织上的人都很想念你啊~~解决方案四:我姓王但不是老师!!!!解决方案五:该回复于2010-12-17 15:04:12被版主删除解决方案六:谢谢组织上的关心啊,作为部落最有血性的兽人之一,我觉得部落方面应该加强在编程方面的投资,特别是嵌入式的.我是这样想的,代码可以作为一个技能,我们把代码植入武器或装备上,就是一个附魔效果了,而且这个附魔效果和其他附魔效果并不冲突.具体实施细节

一个例子让你了解Java反射机制

通俗地说,反射机制就是可以把一个类,类的成员(函数,属性),当成一个对象来操作,希望读者能理解,也就是说,类,类的成员,我们在运行的时候还可以动态地去操作他们. 理论的东东太多也没用,下面我们看看实践 Demo - Demo: package cn.lee.demo; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetExce

java反射机制 使用Constructor访问构造方法 出现了一个小问题

问题描述 java反射机制 使用Constructor访问构造方法 出现了一个小问题 前面的被测试类JavaApplication1就省略了 下面的是测试类 import java.lang.reflect.Constructor; import java.lang.*; public class Main { JavaApplication1 j=new JavaApplication1(); Class f=j.getClass(); Constructor[] d=f.getDeclare

Java中反射的一个简单使用_java

简介 首先介绍一些不太实用的解释:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制. 简单使用 反射,在java中是非常常见和好用的一种方式,(但是大家需要知道,他的效率是比较低的,所以要慎用)当然在基于java语言而产生的Android中也是可以使用的,我们可以使用反射来获取一些系统并不开放,但是存在的类,从而调用他的一些方法,下面就简单的写一下

Java反射机制:包括组成、结构和示例说明等内容

第1部分 Java 反射机制介绍 Java 反射机制.通俗来讲呢,就是在运行状态中,我们可以根据"类的部分已经的信息"来还原"类的全部的信息".这里"类的部分已经的信息",可以是"类名"或"类的对象"等信息."类的全部信息"就是指"类的属性,方法,继承关系和Annotation注解"等内容. 举个简单的例子:假设对于类ReflectionTest.java,我们知道的

java 反射机制系列(一) 初识Java Reflection

Java 反射机制是指Java程序可以在执行期载入,探知,使用编译期间完全未知的classes.这句话可能有点难以理解,我们可以通过一个例子来看.在Java程序中我们经常会用到这样一条语句来创建一个对象.Date date = new Date();在这条语句中date的类型(Java.util.Date)在编译时 已经确定.那么,有没有办法使我们把对象类型的确定时间由编译转到运行,答案是肯定的.这就是Java反射机制所提供的便利.而且它不单单可以生成对象还可以获取Field,对Field设值,

使用Java反射机制确定基本数据类型属性

Java反射机制提供了一种强大的应用程序接口来帮助我们在运行时检测和执行对象上的操作.该机制允许程序员审视一个未知对象,并且获得它的属性,例如对象上的方法,JavaBean的属性以及继承关系等. Java中有两种类型的值,一种是类类型,它把对象的属性定义在一个类中.类类型是面向对象结构的基本组成部分.第二种类型的值是基本数据类型.反射类型通常用于类类型,但是,其实它也可以很方便应用到Java的基本类型上. Java中的基本类型继承自基于C的语法,其中包括boolean.byte.short.in

Java 反射之动态代理

利用Java反射机制你可以在运行期动态的创建接口的实现.java.lang.reflect.Proxy类就可以实现这一功能.这个类的名字(译者注:Proxy意思为代理)就是为什么把动态接口实现叫做动态代理.动态的代理的用途十分广泛,比如数据库连接和事物管理(transaction management)还有单元测试时用到的动态mock对象以及AOP中的方法拦截功能等等都使用到了动态代理. 创建代理你可以通过使用Proxy.newProxyInstance()方法创建动态代理.newProxyIn

继承-关于java反射的问题!

问题描述 关于java反射的问题! RT: 例如:有一个工具类BaseUtil 方法:public class BaseUtil 一个java普通类:User 继承 BaseUtil 方法 public class User() extends BaseUtil<User>{}; 问题来了 我在BaseUtil类里如何获取继承它本身的类实例?(运行时) 解决方案 浅谈java反射问题java反射里的数组问题Java反射相关问题 解决方案二: 通过反射可以取得 本类的构造器,属性, 权限修饰符