欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java通过PropertyDescriptor反射调用set和get方法

程序员文章站 2024-03-06 10:40:31
本文实例为大家分享了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); 
 } 
 } 
} 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。