通过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

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • javaweb登录注册功能实现 javaweb 登陆注册 入门 mysql数据库交互 web前后台交互 用户管理增删改查 实现登录 注册 登陆 JavaWeb 简单登陆注册「建议收藏」

    javaweb登录注册功能实现 javaweb 登陆注册 入门 mysql数据库交互 web前后台交互 用户管理增删改查 实现登录 注册 登陆 JavaWeb 简单登陆注册「建议收藏」用户登录注册流程图老版:新版:登陆界面注册界面登陆成功界面LoginServletimportjava.io.IOException;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servle…

    2022年6月3日
    32
  • (转载)LaTeX实战经验:从零开始快速入门

    (转载)LaTeX实战经验:从零开始快速入门对于理工科的学生来说,尤其是从研究生阶段开始,LaTeX应该会是日常中必不可少的写作工具。毕竟要写什么公式的话,不用LaTeX实在是不知道要怎么办。况且要是投稍微专业一点的论文,LaTeX是必须的,没人会接收Word文件。此篇为写给一些想快速入门LaTeX的朋友,至于为什么要叫从零开始,因为我就是从零开始学会的LaTeX。如果你不是那么“聪慧”,LaTeX可能的学习曲线会显得比较曲折。但熟能生…

    2022年5月25日
    114
  • TCP Flow Control

    TCP Flow Control这里写自定义目录标题TCPFlowControlTCP简述TCP传输机制滑动窗口FlowControl计时器总结TCPFlowControl最近在学习《计算机网络》在TCP的FlowControl部分理解不太清楚,查阅了资料后有一些粗浅的理解,如有不准确的地方,请大佬指正。参考资料1.计算机网络2.TCPFlowControlTCP简述TCP(Transmissi…

    2022年6月6日
    40
  • 移动亲情网有漫游费吗_北京移动和家庭套餐介绍

    移动亲情网有漫游费吗_北京移动和家庭套餐介绍为进一步满足客户国内长途及国内漫游通话需求,中国移动北京公司将于近期推出长漫亲情省业务,现就相关事宜通知如下:  一、推出时间  2009年4月18日0时  二、目标客户  动感地带、神州行家园卡  三、具体内容  月功能费1元,客户可指定除北京外国内任一省、自治区或直辖市为亲情省(不含港澳台),客户在北京向亲情省拨打长途每分钟0.19元;客户漫游至亲情省拨打国内电话(不含港澳台)、接听电话每分钟

    2022年10月7日
    0
  • 全球邮箱正则表达式是什么_验证邮箱的正则表达式

    全球邮箱正则表达式是什么_验证邮箱的正则表达式最近做外贸,涉及到邮箱的匹配,网上查了一下,没有合适的,因为设计到各种语言,各种格式的邮箱,就尝试自己写了,效果还可以。$partten=’/[^`~!@#$%\^&\*\(\)\+=\|\{\}\’:;\’,\\\[\]<>\/\?~!@#¥%……&\*()——+\|\{\}【】‘;:”“’。,、?\s]{1,}@[^`~!@#$%\^&\*\(\)…

    2022年9月2日
    3
  • windows10下关闭端口占用[通俗易懂]

    windows10下关闭端口占用[通俗易懂]windows10下关闭端口占用windows10下关闭端口占用占用查询端口的pid查询关闭对应pid很少用windows,但是本地开发一直都是windows系统,如果端口发生意外,没有被关闭,如下可解决。占用查询端口的pid查询C:\Users\helloworld>netstat-ano|findstr"9097"TCP0.0.0….

    2022年7月20日
    22

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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