使用java如何获取对象的私有成员变量的值呢?
有一个bean:
public class Student2 {
/***
* 学号
*/
private String schoolNumber;
private String classroom;
public void setSchoolNumber(String schoolNumber) {
this.schoolNumber = schoolNumber;
}
public String getClassroom() {
return classroom;
}
public void setClassroom(String classroom) {
this.classroom = classroom;
}
}
测试:
@Test
public void test_getObjectValue() throws SecurityException,
IllegalArgumentException, NoSuchFieldException,
IllegalAccessException {
Student2 p = new Student2();
p.setPersonName("哥斯拉");
System.out.println(ReflectHWUtils.getObjectValue(p, "personName"));
}
运行结果:哥斯拉
getObjectValue的实现:
/***
* 获取指定对象的属性值
*
* @param obj
* @param name
* :Field
* @return
* @throws SecurityException
* @throws NoSuchFieldException
* @throws IllegalArgumentException
* @throws IllegalAccessException
*/
public static Object getObjectValue(Object obj, Field name)
throws SecurityException, NoSuchFieldException,
IllegalArgumentException, IllegalAccessException {
// Field f = getSpecifiedField(obj.getClass(), name.getName());
if (name == null) {
System.out.println("[ReflectHWUtils.getObjectValue]"
+ obj.getClass().getName() + " does not has field " + name);
return null;
}
name.setAccessible(true);
return name.get(obj);
}
/***
* 获取指定对象的属性值
*
* @param obj
* @param propertyName
* @return
* @throws SecurityException
* @throws NoSuchFieldException
* @throws IllegalArgumentException
* @throws IllegalAccessException
*/
public static Object getObjectValue(Object obj, String propertyName)
throws SecurityException, NoSuchFieldException,
IllegalArgumentException, IllegalAccessException {
if (ValueWidget.isNullOrEmpty(propertyName)) {
return null;
}
Class<?> clazz = obj.getClass();
Field name = getSpecifiedField(clazz, propertyName);
if (ValueWidget.isNullOrEmpty(name)) {
propertyName=ValueWidget.title(propertyName);//convert "Key2" to "key2"
name = getSpecifiedField(clazz, propertyName);
if (ValueWidget.isNullOrEmpty(name)) {
System.out.println("[ReflectHWUtils.getObjectValue]"
+ obj.getClass().getName() + " does not has field "
+ propertyName);
return null;
}
}
return getObjectValue(obj, name);
}
使用反射设置对象的值
@Test
public void test_setObjectValue() throws SecurityException,
IllegalArgumentException, NoSuchFieldException,
IllegalAccessException {
Student2 p = new Student2();
ReflectHWUtils.setObjectValue(p, "classroom", "三六班");
System.out.println(p.getClassroom());
}
运行结果:
三六班
setObjectValue 的实现:
/***
* 设置对象的属性值。
*
* @param obj
* @param propertyName
* : property name
* @param propertyValue
* : value of property<br> must be String or Field
* @throws SecurityException
* @throws NoSuchFieldException
* @throws IllegalArgumentException
* @throws IllegalAccessException
*/
public static void setObjectValue(Object obj, Object propertyName,
Object propertyValue) throws SecurityException,
NoSuchFieldException, IllegalArgumentException,
IllegalAccessException {
if (ValueWidget.isNullOrEmpty(propertyName)
|| ValueWidget.isNullOrEmpty (propertyValue)) {
return;
}
Class<?> clazz = obj.getClass();
Field name = null;
if(propertyName instanceof String){
name=getSpecifiedField(clazz, (String)propertyName);
}else{
name=(Field)propertyName;
}
name.setAccessible(true);
name.set(obj, propertyValue);
}
测试类:io0007-find_progess\src\test\java\com\test\UnitTest.java
源代码见附件:io0007-find_progess.zip
更多源代码下载:http://pan.baidu.com/s/1kTA7vOr