您的位置:首页 > 编程语言 > Java开发

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的相同属性】:

首先,实体类[由于只是测试反射,所以实体类中的属性注释就没写了,没有实际意义]:

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 泛型 反射