Java通过PropertyDescriptor反射调用set和get方法
程序员文章站
2024-03-05 09:47:30
本文实例为大家分享了propertydescriptor反射调用set和get方法,供大家参考,具体内容如下
第一段:
package com.zhoushun...
本文实例为大家分享了propertydescriptor反射调用set和get方法,供大家参考,具体内容如下
第一段:
package com.zhoushun; import java.lang.reflect.method; import java.lang.reflect.field; import java.beans.propertydescriptor; public class propertyutil { @suppresswarnings("unchecked") public static propertydescriptor getpropertydescriptor(class clazz, string propertyname) { stringbuffer sb = new stringbuffer();//构建一个可变字符串用来构建方法名称 method setmethod = null; method getmethod = null; propertydescriptor pd = null; try { field f = clazz.getdeclaredfield(propertyname);//根据字段名来获取字段 if (f!= null) { //构建方法的后缀 string methodend = propertyname.substring(0, 1).touppercase() + propertyname.substring(1); sb.append("set" + methodend);//构建set方法 setmethod = clazz.getdeclaredmethod(sb.tostring(), new class[]{ f.gettype() }); sb.delete(0, sb.length());//清空整个可变字符串 sb.append("get" + methodend);//构建get方法 //构建get 方法 getmethod = clazz.getdeclaredmethod(sb.tostring(), new class[]{ }); //构建一个属性描述器 把对应属性 propertyname 的 get 和 set 方法保存到属性描述器中 pd = new propertydescriptor(propertyname, getmethod, setmethod); } } catch (exception ex) { ex.printstacktrace(); } return pd; } @suppresswarnings("unchecked") public static void setproperty(object obj,string propertyname,object value){ class clazz = obj.getclass();//获取对象的类型 propertydescriptor pd = getpropertydescriptor(clazz,propertyname);//获取 clazz 类型中的 propertyname 的属性描述器 method setmethod = pd.getwritemethod();//从属性描述器中获取 set 方法 try { setmethod.invoke(obj, new object[]{value});//调用 set 方法将传入的value值保存属性中去 }catch (exception e){ e.printstacktrace(); } } @suppresswarnings("unchecked") public static object getproperty(object obj, string propertyname){ class clazz = obj.getclass();//获取对象的类型 propertydescriptor pd = getpropertydescriptor(clazz,propertyname);//获取 clazz 类型中的 propertyname 的属性描述器 method getmethod = pd.getreadmethod();//从属性描述器中获取 get 方法 object value =null ; try { value = getmethod.invoke(clazz, new object[]{});//调用方法获取方法的返回值 } catch (exception e) { e.printstacktrace(); } return value;//返回值 } }
第二段:
public boolean setvalue(object objset, object objget) throws illegalargumentexception, securityexception, instantiationexception, illegalaccessexception, invocationtargetexception, nosuchmethodexception, introspectionexception { boolean flag = true; field fields[] = objset.getclass().getdeclaredfields(); string value = ""; string fieldnameget = ""; list list = new arraylist(); field afield[]; int j = (afield = fields).length; for(int i = 0; i < j; i++) { field field = afield[i]; string fieldname = field.getname(); fieldnameget = xmltomodel(fieldname); if(!"error".equals(fieldnameget)) { propertydescriptor pd = new propertydescriptor(fieldnameget, objget.getclass()); method getmethod = pd.getreadmethod(); value = string.valueof(getmethod.invoke(objget, new object[0])); boolean checkresult = returnmessage.checkvalue(value, fieldnameget); if(checkresult) { propertydescriptor pd1 = new propertydescriptor(fieldname, objset.getclass()); method setmethod = pd1.getwritemethod(); setmethod.invoke(objset, new object[] { field.gettype().getconstructor(new class[] { java/lang/string }).newinstance(new object[] { value }) }); } else { flag = checkresult; } } } return flag; }
第三段:
import java.beans.propertydescriptor; import java.lang.reflect.field; import java.lang.reflect.method; public class reflecttest { public static void main(string[] args) throws exception { class clazz = class.forname("taskprovidepropslist");//这里的类名是全名。。有包的话要加上包名 object obj = clazz.newinstance(); field[] fields = clazz.getdeclaredfields(); //写数据 for(field f : fields) { propertydescriptor pd = new propertydescriptor(f.getname(), clazz); method wm = pd.getwritemethod();//获得写方法 wm.invoke(obj, 2);//因为知道是int类型的属性,所以传个int过去就是了。。实际情况中需要判断下他的参数类型 } //读数据 for(field f : fields) { propertydescriptor pd = new propertydescriptor(f.getname(), clazz); method rm = pd.getreadmethod();//获得读方法 integer num = (integer) rm.invoke(obj);//因为知道是int类型的属性,所以转换成integer就是了。。也可以不转换直接打印 system.out.println(num); } } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: Android实现字母雨的效果