java反射--Field
2015-10-28 17:50
537 查看
反射中有个属性类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的相同属性】:
首先,实体类[由于只是测试反射,所以实体类中的属性注释就没写了,没有实际意义]:
实现类:
测试执行类:
程序执行结果:
----反射赋值(此可以用于解析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);
对这个感兴趣的朋友可以执行看看,最好是自己写一个,看着是简单的例子,不写完全发现不了其中隐藏的细节问题,这里就不一一说明了!
欢迎指出不足的地方,一起多探讨!!!!
首先:
需要弄清楚 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=123456 age=20 createDate=Wed Oct 28 17:47:28 CST 2015 country=null city=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);
对这个感兴趣的朋友可以执行看看,最好是自己写一个,看着是简单的例子,不写完全发现不了其中隐藏的细节问题,这里就不一一说明了!
欢迎指出不足的地方,一起多探讨!!!!
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- [原创]java局域网聊天系统