java反射--Field
来源:互联网 发布:网络宣传方式有哪些 编辑:程序博客网 时间:2024/05/17 06:54
反射中有个属性类Field,其提供关于属性的操作,下面通过一个实例来展示Field的运用!
首先:
需要弄清楚 getFields()和getDeclaredFields()获取属性字段的区别:
getFields():获取该类中的public属性,包括从父类中继承的public属性字段。仅限public修饰的属性。
getDeclaredFields():获取该类中的所有属性,包括public,protected,private,【默认】修饰的属性。但是不包括父类的所有属性。
LeftEntity le = new LeftEntity();
Class clazz = le.getClass();
Field[] fields = clazz.getDeclaredFields();
// 该属性的修饰符
int modifiers = field.getModifiers();
下面是modifiers的值分别对应的修饰符:
0:默认的
1:public
2:private
4:protected
实例代码Field :
下面上实例代码【实例目的:把RightEntity中属性的值赋给LeftEntity的相同属性】:
首先,实体类[由于只是测试反射,所以实体类中的属性注释就没写了,没有实际意义]:
package com.main.src.entity;import java.util.Date;public class RightEntity { public String name = null; public String pass = null; public int age = 0; public Date createDate = null; /************区分字段******************/ public String constrict = null; public String province = null; public RightEntity() { this.name = "张三"; this.pass = "123456"; this.age = 20; this.createDate = new Date(); this.constrict = "西湖区"; this.province = "浙江省"; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPass() { return pass; } public void setPass(String pass) { this.pass = pass; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Date getCreateDate() { return createDate; } public void setCreateDate(Date createDate) { this.createDate = createDate; } public String getConstrict() { return constrict; } public void setConstrict(String constrict) { this.constrict = constrict; } public String getProvince() { return province; } public void setProvince(String province) { this.province = province; }}
package com.main.src.entity;import java.util.Date;public class LeftEntity { private String name = null; public String pass = null; int age = 0; protected Date createDate = null; /************区分字段******************/ public String country = null; public String city = null; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPass() { return pass; } public void setPass(String pass) { this.pass = pass; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Date getCreateDate() { return createDate; } public void setCreateDate(Date createDate) { this.createDate = createDate; } public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } public String getCity() { return city; } public void setCity(String city) { this.city = city; }}
实现类:
package com.main.src.businessImpl;import java.lang.reflect.Field;public class BizImpl { /** * 通过泛型定义的方法,给两个类的相同属性赋值 * * @param <T> * @param <K> * @param t * @param k * @return * @throws IllegalArgumentException * @throws IllegalAccessException */ public static <T, K> T entityValueChange(T t, K k) throws IllegalArgumentException, IllegalAccessException { // 获取类加载对象Class Class claT = t.getClass(); Class claK = k.getClass(); // 获取该类中所有属性 Field[] fieldTs = claT.getDeclaredFields(); Field[] fieldKs = claK.getDeclaredFields(); for (Field fieldt : fieldTs) { // 当该属性修饰符不是public的场合,需要给该属性添加可访问标识 if (fieldt.getModifiers() != 1) { fieldt.setAccessible(true); } for (Field fieldk : fieldKs) { // 当属性名称和类型都相同的时候才赋值 if (fieldt.getName().equals(fieldk.getName()) && fieldt.getType() == fieldk.getType()) { if (fieldk.getModifiers() != 1) { fieldk.setAccessible(true); } // 赋值 fieldt.set(t, fieldk.get(k)); } } } // 返回值 return t; }}
测试执行类:
/** * * @param args * @throws IllegalAccessException * @throws IllegalArgumentException * @throws NoSuchFieldException * @throws SecurityException * @throws IllegalAccessException * @throws IllegalArgumentException */ public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException { // 有值的实体类 RightEntity re = new RightEntity(); // 待赋值实体类 LeftEntity le = new LeftEntity(); // 给实体相同属性赋值 le = BizImpl.entityValueChange(le, re); // 在这里获取类加载对象Class的时候,还可以用这种方法获取【Class clazz = LeftEntity.class;】 Class clazz = le.getClass(); // 获取该类所有属性并打印值 Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { // 当该属性修饰符不是public的场合,需要给该属性添加可访问标识 if (field.getModifiers() != 1) { field.setAccessible(true); } System.out.println(field.getName() + "=" + field.get(le)); } }
程序执行结果:
name=张三pass=123456age=20createDate=Wed Oct 28 17:47:28 CST 2015country=nullcity=null
----反射赋值(此可以用于解析socket报文体,DecodeMessage用):
String body = "1&2&3&4&5&6&7&8&9&10&11&12";String[] fieldValues = StringUtils.split(body, "&");Field[] fields = ClassA.class.getDeclaredFields();Object obj = new ClassA();for (int i = 0; i < fieldValues.length; i++) {fields[i].setAccessible(true);fields[i].set(obj, fieldValues[i]);}System.out.println(obj);
对这个感兴趣的朋友可以执行看看,最好是自己写一个,看着是简单的例子,不写完全发现不了其中隐藏的细节问题,这里就不一一说明了!
欢迎指出不足的地方,一起多探讨!!!!
0 0
- java 反射 Field
- java 反射 Field类
- java 反射 Field类
- java 反射 Field类
- java 反射 Field类
- java 反射 Field类
- JAVA反射Field使用
- java反射--Field
- java反射之-Field
- java反射之Field
- Java反射,字段Field
- Java 反射机制[Field反射]
- java反射(Field的应用)
- Java反射(三)Field
- Java反射系列之Field
- Java反射之Field用法
- java反射——Field
- java反射——Field
- 【HDOJ】【1014】Uniform Generator
- 利用scp 远程上传下载文件/文件夹
- CocoaPods的安装方法 安装ruby环境
- ios学习笔记(二)
- 1095. Cars on Campus
- java反射--Field
- 安装sql server时提示缺少.NET 3.5 sp1
- CodeForces 261B Maxim and Restaurant [数学+基础DP]
- JAVA----关键字用法
- iOS —— IOS8适配
- C#泛型与委托
- 前端不为人知的一面--前端冷知识集锦
- Lifecycle(生命周期)和Phase(阶段)
- jquery.autocomplete样本