JAVA反射系列之Field,java.lang.reflect.Field使用获取方法。
2016-07-06 16:06
567 查看
java.lang.reflect.Field使用 Field. 首先必须明一点 Field类主要是用来辅助获取和操作类的属性的! 1.怎么通过反射获取类的属性 先来看JDK提供的方法有如下几种: a)Class.getDeclaredField(String name); 返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。 b)Class.getDeclaredFields(); 返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。 c)Class.getField(String name); 返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。 d)Class.getField(); 返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。 来一个例子来说明一下 : 实体类: import java.util.Date; /** * @ClassName: Student * @Description: 学生实体 * @author JoseanLuo * @date 2014-3-18 下午5:17:35 * @version V1.0 */ public class Student { private Long id; private String name; private Date createdate; private String no; public String nickname; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Date getCreatedate() { return createdate; } public void setCreatedate(Date createdate) { this.createdate = createdate; } public String getNo() { return no; } public void setNo(String no) { this.no = no; } public String getNickname() { return nickname; } public void setNickname(String nickname) { this.nickname = nickname; } } 测试类: import java.lang.reflect.Field; import java.util.Date; /** * @ClassName: ReflectFieldTest * @Description: 反射Field测试。 * @author JoseanLuo * @date 2014-3-18 下午5:16:17 * @version V1.0 */ public class ReflectFieldTest { public static void main(String[] args) { Student stu=new Student(); stu.setId(1L); stu.setName("Josean"); stu.setNo("201403185203344"); stu.setCreatedate(new Date()); try { Field property1=stu.getClass().getDeclaredField("name"); System.out.println(property1);//private java.lang.String com.cx.test.Student.name Field property3=stu.getClass().getField("nickname"); System.out.println(property3);//public java.lang.String com.cx.test.Student.nickname //错误方法 getField系列方法只能获取公共字段 //Field property2=stu.getClass().getField("name"); //System.out.println(property2); //会抛java.lang.NoSuchFieldException } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } } } 2.进行属性获取更改 得到这个Field之后你就可以获取他的值或者设置他的值了。 获取他的值用get类型方法,他针对常见类型提供了对应get方法,这里就不一一列举了。 值得注意的是获取私有属性的时候必须先设置Accessible为true,然后才能获取。 同理设置的时候调用set类型方法,这里也不一一列举了,下面放代码。 import java.lang.reflect.Field; import java.util.Date; /** * @ClassName: ReflectFieldTest * @Description: 反射Field测试。 * @author JoseanLuo * @date 2014-3-18 下午5:16:17 * @version V1.0 */ public class ReflectFieldTest { public static void main(String[] args) throws Exception { Student stu=new Student(); stu.setId(1L); stu.setName("Josean"); stu.setNo("201403185203344"); stu.setCreatedate(new Date()); stu.setNickname("copyman"); Field property1=stu.getClass().getDeclaredField("name"); //System.out.println(property1);//out:private java.lang.String com.cx.test.Student.name Field property3=stu.getClass().getField("nickname"); System.out.println(property3.get(stu)); //System.out.println(property3);//out:public java.lang.String com.cx.test.Student.nickname //错误方法 getField系列方法只能获取公共字段 //Field property2=stu.getClass().getField("name"); //System.out.println(property2); //会抛java.lang.NoSuchFieldException Field [] prFields4=stu.getClass().getDeclaredFields(); for(Field field:prFields4) { System.out.println(field); System.out.println(field.equals(property1)); //私有变量必须先设置Accessible为true field.setAccessible(true); //获取用get类方法。 System.out.println(field.get(stu)); } //设置用set类方法 property3.set(stu, "名字被我改了,哈哈"); System.out.println(stu.getNickname()); } } 这个是控制台输出: copyman private java.lang.Long com.cx.test.Student.id false 1 private java.lang.String com.cx.test.Student.name true Josean private java.util.Date com.cx.test.Student.createdate false Tue Mar 18 18:19:39 CST 2014 private java.lang.String com.cx.test.Student.no false 201403185203344 public java.lang.String com.cx.test.Student.nickname false copyman 名字被我改了,哈哈来自:http://my.oschina.net/u/1407116/blog/209383
相关文章推荐
- java反射詳解
- Spring注解@Component、@Repository、@Service、@Controller区别
- Eclipse搜索快捷键
- JAVA用POI读取和创建2003和2007版本Excel
- ajax异步从前台传值给后天中文乱码的几种情况及解决办法
- 了解spring security
- java链表之--双向循环链表
- 把时间由TIMESTAMP类型改为String类型
- Java性能优化:遍历
- 由xml生成对应Java类
- spring mvc框架和蓝信做对接。 总结一下。
- 文章标题
- springmvc sends and receives data by ajax request using json format
- 动态规划求一个数列的最长不下降子序列java版
- java 正则表达式 -Regular Expression
- java.lang.OutOfMemoryError: PermGen space eclipse解决方法
- 获取签名证书的SHA1值说明
- 【spring】BeanPostProcessor使用场景之@Autowired
- Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM)
- [转]详解Java解析XML的四种方法