通过PropertyDescriptor反射进行字段名值的获取及设置

通过PropertyDescriptor反射进行字段名值的获取及设置/** *根据属性名获取对应的value *@paramfieldName *@paramobj *@return *@throwsException */privatestaticStringgetValueByFiled(StringfieldName,Objectobj)throwsException{  //属性扫描器

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

/**
 * 根据属性名获取对应的value
 * @param fieldName
 * @param obj
 * @return
 * @throws Exception
 */
private static String getValueByFiled(String fieldName,Object obj)throws Exception{

       //属性扫描器
        PropertyDescriptor pd = new PropertyDescriptor(fieldName, obj.getClass());
        //从属性描述器中获取 get 方法
        Method method = pd.getReadMethod();
        //结果
        Object value = method.invoke(obj);
        //执行方法并返回结果
        return value==null?””:String.valueOf(value);
}

   

下面是比较完整的

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;  
    }  
    //对obj对象的指定字段进行值设置
    @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;//返回值  
    }  
}  


//调用

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);  
  }  
 }  
}  

参考:http://blog.csdn.net/qq_34120041/article/details/53665526

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/187099.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • java中创建数组的三种方法

    java中创建数组的三种方法publicstaticvoidmain(String[]args){ //创建数组的第一种方法 int[]arr=newint[6]; intintValue=arr[5]; //System.out.println(intValue); //创建数组的第二种方法 int[]x={1,2,3,4}; //System.out.println(x[1]); //…

  • 接口测试框架之Karate

    接口测试框架之Karate之前在一些博客中零零散散看到过对Karate介绍,基本都和Graphql接口测试绑定在一起,似乎测试GraphqlAPI首选的工具之一就是Karate。后来一位开发大牛也推荐我使用Karate,他提到自己之前的项目中就用框架测试Graphql接口,且强调该框架在ThoughtWorks的技术雷达中。想着Graphql使用越来越广泛,且技术雷达中介绍过的框架一般都有其独特优势,带着这些好奇心我花了…

    2022年10月23日
  • 图像检索评价指标:PR曲线的计算与绘制

    图像检索评价指标:PR曲线的计算与绘制#@filename:test2.py#@brief:如何绘制PR曲线#@author:liupc#@date:2021/8/2importnumpyasnpfromtqdmimporttqdmimportmatplotlib.pyplotasplt#计算汉明距离。有几位不同,距离就为几。defCalcHammingDist(B1,B2):q=B2.shape[1]distH=.

  • 如何查询手机当前基站编号信息呢_基站实测

    如何查询手机当前基站编号信息呢_基站实测Android:拨号*#*#4636#*#*进入手机信息工程模式后查看。iPhone:拨号*3001#12345#*进入FieldTest,LAC(MMInfo>ServingPLMN),3Gcellid(UMTSCellEnvironment>UMTSRRInfo),2Gcellid(GSMCellEnvironment>GSMCellInfo>

    2022年10月28日
  • 声源定位系统设计(一)——MVDR波束形成算法「建议收藏」

    声源定位系统设计(一)——MVDR波束形成算法「建议收藏」本篇博客希望通过通俗的方式讲清一些简单经典声源定位的方法,并能够按照这种方法自制一个声源定位系统。

  • latex中双引号和单引号的正确应用[通俗易懂]

    latex中双引号和单引号的正确应用[通俗易懂]用输入法中的中文模式键入的双引号和单引号并不是LaTeX的正确输入方式。正确的输入方法如下:使用键盘的Tab键上侧的连续键入两个“然后输入键盘的双引号’’。单引号输入类似。示例如下:演示代码:\documentclass{article}\setlength\textwidth{150pt}\begin{document}\largePumasare“large,cat-likeanimals’’whichare`foundinAmerica’.Whenr

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号