使用反射获取和设置对象的值

使用Java如何获取对象的私有成员变量的值呢?

有一个bean:

Java代码  

  1. public class Student2 {  
  2.     /*** 
  3.      * 学号 
  4.      */  
  5.     private String schoolNumber;  
  6.     private String classroom;  
  7.   
  8.       
  9.   
  10.     public void setSchoolNumber(String schoolNumber) {  
  11.         this.schoolNumber = schoolNumber;  
  12.     }  
  13.   
  14.     public String getClassroom() {  
  15.         return classroom;  
  16.     }  
  17.   
  18.     public void setClassroom(String classroom) {  
  19.         this.classroom = classroom;  
  20.     }  
  21.   
  22. }  

 测试:

Java代码  

  1. @Test  
  2.     public void test_getObjectValue() throws SecurityException,  
  3.             IllegalArgumentException, NoSuchFieldException,  
  4.             IllegalAccessException {  
  5.         Student2 p = new Student2();  
  6.         p.setPersonName("哥斯拉");  
  7.         System.out.println(ReflectHWUtils.getObjectValue(p, "personName"));  
  8.     }  

运行结果:哥斯拉 

 

getObjectValue的实现:

Java代码  

  1. /*** 
  2.      * 获取指定对象的属性值 
  3.      *  
  4.      * @param obj 
  5.      * @param name 
  6.      *            :Field 
  7.      * @return 
  8.      * @throws SecurityException 
  9.      * @throws NoSuchFieldException 
  10.      * @throws IllegalArgumentException 
  11.      * @throws IllegalAccessException 
  12.      */  
  13.     public static Object getObjectValue(Object obj, Field name)  
  14.             throws SecurityException, NoSuchFieldException,  
  15.             IllegalArgumentException, IllegalAccessException {  
  16.   
  17.         // Field f = getSpecifiedField(obj.getClass(), name.getName());  
  18.         if (name == null) {  
  19.             System.out.println("[ReflectHWUtils.getObjectValue]"  
  20.                     + obj.getClass().getName() + " does not has field " + name);  
  21.             return null;  
  22.         }  
  23.         name.setAccessible(true);  
  24.         return name.get(obj);  
  25.     }  
  26.   
  27.     /*** 
  28.      * 获取指定对象的属性值 
  29.      *  
  30.      * @param obj 
  31.      * @param propertyName 
  32.      * @return 
  33.      * @throws SecurityException 
  34.      * @throws NoSuchFieldException 
  35.      * @throws IllegalArgumentException 
  36.      * @throws IllegalAccessException 
  37.      */  
  38.     public static Object getObjectValue(Object obj, String propertyName)  
  39.             throws SecurityException, NoSuchFieldException,  
  40.             IllegalArgumentException, IllegalAccessException {  
  41.         if (ValueWidget.isNullOrEmpty(propertyName)) {  
  42.             return null;  
  43.         }  
  44.         Class<?> clazz = obj.getClass();  
  45.         Field name = getSpecifiedField(clazz, propertyName);  
  46.         if (ValueWidget.isNullOrEmpty(name)) {  
  47.             propertyName=ValueWidget.title(propertyName);//convert "Key2" to "key2"  
  48.             name = getSpecifiedField(clazz, propertyName);  
  49.               
  50.             if (ValueWidget.isNullOrEmpty(name)) {  
  51.                 System.out.println("[ReflectHWUtils.getObjectValue]"  
  52.                         + obj.getClass().getName() + " does not has field "  
  53.                         + propertyName);  
  54.             return null;  
  55.             }  
  56.         }  
  57.         return getObjectValue(obj, name);  
  58.     }  

 

 

 

 

使用反射设置对象的值

 

Java代码  

  1. @Test  
  2.     public void test_setObjectValue() throws SecurityException,  
  3.             IllegalArgumentException, NoSuchFieldException,  
  4.             IllegalAccessException {  
  5.         Student2 p = new Student2();  
  6.         ReflectHWUtils.setObjectValue(p, "classroom", "三六班");  
  7.         System.out.println(p.getClassroom());  
  8.     }  

 运行结果:

 

三六班

setObjectValue 的实现:

 

Java代码  

  1. /*** 
  2.      * 设置对象的属性值。 
  3.      *  
  4.      * @param obj 
  5.      * @param propertyName 
  6.      *            : property name 
  7.      * @param propertyValue 
  8.      *            : value of property<br> must be String or Field 
  9.      * @throws SecurityException 
  10.      * @throws NoSuchFieldException 
  11.      * @throws IllegalArgumentException 
  12.      * @throws IllegalAccessException 
  13.      */  
  14.     public static void setObjectValue(Object obj, Object propertyName,  
  15.             Object propertyValue) throws SecurityException,  
  16.             NoSuchFieldException, IllegalArgumentException,  
  17.             IllegalAccessException {  
  18.         if (ValueWidget.isNullOrEmpty(propertyName)  
  19.                 || ValueWidget.isNullOrEmpty (propertyValue)) {  
  20.             return;  
  21.         }  
  22.         Class<?> clazz = obj.getClass();  
  23.         Field name = null;  
  24.         if(propertyName instanceof String){  
  25.         name=getSpecifiedField(clazz, (String)propertyName);  
  26.         }else{  
  27.             name=(Field)propertyName;  
  28.         }  
  29.         name.setAccessible(true);  
  30.         name.set(obj, propertyValue);  
  31.   
  32.     }  

 测试类:io0007-find_progess\src\test\java\com\test\UnitTest.java

时间: 2024-09-17 19:32:40

使用反射获取和设置对象的值的相关文章

Java通过反射机制动态设置对象属性值的方法_java

/** * MethodName: getReflection<br> * Description:解析respXML 在通过反射设置对象属性值 * User: liqijing * Date:2015-7-19下午12:42:55 * @param clzzName * @param respXML * @return * @throws ClassNotFoundException * @throws DocumentException * @throws IllegalArgumentE

go语言通过反射获取和设置结构体字段值的方法_Golang

本文实例讲述了go语言通过反射获取和设置结构体字段值的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: type MyStruct struct {         N int } n := MyStruct{ 1 } // get immutable := reflect.ValueOf(n) val := immutable.FieldByName("N").Int() fmt.Printf("N=%d\n", val) // prints

数据类型-通过类反射获取实体类对象

问题描述 通过类反射获取实体类对象 private String[] colName = null; // 属性名数组数组 private String[] colType = null; // 存放实体类的数据类型 如java.lang.Long private String[] colValue = null; // 要存进去的值 请问一下我有一个实体类 要把colValue里的数据以colType类型存到TbUser实体类的属性里 并且返回这个实体类 的对象 请大神给个思路 ... 多谢

利用反射获取方法参数对象的泛型定义

问题描述 利用反射获取方法参数对象的泛型定义 public CommonRsp<AAARsp> hotelCheckAvailability(CommonReq<BBBReq> req) throws Exception; 如何通过反射获取如上方法中的参数泛型定义BBBReq? 解决方案 你这是java语法吗,如果是的话,其实java的泛型本质上是糖衣语法,编译后泛型是会被擦除的.你获取泛型本质上是没有意义的,应该是获取不到的.

Jquery 获取和设置元素属性值

Jquery 获取和设置元素属性值 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. $(this).attr(key);  获取节点属性名的值,相当于getAttribute(key)方法  $

js 获取和设置css3 属性值的实现方法_javascript技巧

   众多周知 CSS3 增加了很多属性,在读写的时候就没有原先那么方便了.   如:   <div style="left:100px"></div>  只考虑行间样式的话,只需 div.style.left 就可获取,设置的时候也只需要 div.style.left='100px' 即可.很简单.  但是css3来了  如:   <div style="-webkit-transform: translate(20px,-20px)"

Query常用DIV操作获取和设置长度宽度的实现方法_jquery

获取或设置div的高度和宽度 方法一:height和width函数(得到的是证书),可以用于获取或设置元素的高度和宽度. val()获取或设置元素的值 方法二:css函数可以用于获取或设置元素的高度和宽度 获取css("width")(得到的是以px结尾的字符串),设置css("width",20px)或css({width:20px,height:20px}) JQuery的链式操作 <!DOCTYPE html PUBLIC "-//W3C//D

java中使用反射获取pojo(实体)类的所有字段值

       说起反射,不得不说它实在是太强大了,通过反射就可以轻轻松松拿到各种东东,如果你想在项目中解除对某个类的依赖,可以考虑用反射.        今天跟大家分享的是通过java中的反射,获取pojo类的所有字段值.        为什么要做这个操作的呢?主要是为了重写实体类的toString方法.有人会说,直接重写toString方法,返回字段.toString()的字符串不就行了.这么做的确可以,但是如果你的pojo类有上百个,上千个,你还要一个一个改吗?所以我们需要从新的方向去解决.

Js与Jq获取浏览器和对象值的方法_javascript技巧

JS and Jquery 都能获取页面元素的宽度,高度和相对位移等数值,那他们之间能相互转换或替代吗,写法又有哪些差异呢?本文将详细为你介绍. 1.Js获取浏览器高度和宽度 document.documentElement.clientWidth ==> 浏览器可见区域宽度 document.documentElement.clientHeight ==> 浏览器可见区域高度 document.body.clientWidth ==> BODY对象宽度 document.body.cl