Java类中的私有的(private)属性是获取不到的(即使使用继承依然获取不到),那如果非要获取私有属性的值怎么办呢?一般的做法是将该java类封装称为一个JavaBean,即封装该私有属性,提供一对共有的get,set方法来访问私有属性。一般情况下都会这样做!但遇到特殊情况呢?比如,现有一个需求:访问一个Java类的私有属性,并且该类不提供访问该私有属性的共有方法。
          
          比如说有些时候接口返回参数是Object范类型,但是实际我们是知道里面的实体类型,这个时候直接进行强制转换即可。如下:                  
          ReturnDatard=newReturnData();
          User obj=newUser();
          obj.setCustId(1L);
          rd.setObj(obj);
         User  obj2= (User)rd.getObj();
          System.out.println(obj2.getCustId());
但如果我们拿到的Object不知道可以转成什么类型的bean,或者说是从其他系统拿到的obeject实体bean,而我们的系统中不存在这个bean的话,这时候java.beans.PropertyDescriptor类就有用武之地了,
ReturnDatard=newReturnData();
         Userobj=newUser();
          obj.setCustId(1L);
          rd.setObj(obj);
          PropertyDescriptor descriptor = new PropertyDescriptor("custId", rd.getObj().getClass());//红色是属性名
          Method readMethod = descriptor.getReadMethod();
          Object invoke = readMethod.invoke(rd.getObj());
          System.out.println(invoke);
     这个属性名一般是通讯双方沟通得知,如果不知道属性名,只能循环出所有的,具体方法看API。
PropertyDescriptor类:
PropertyDescriptor类表示JavaBean类通过存储器导出一个属性。主要方法:
      1. getReadMethod(),获得用于读取属性值的方法
      2.  getWriteMethod(),获得用于写入属性值的方法
注:避免使用拼装方法名,反射获取Method对象。如tId,方法名格式与其他不统一,拼装方法名会错误。
实体类:
package com.learn.pojo;
 
public class person {
    private String tId;
    private String id;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String gettId() {
        return tId;
    }
    public void settId(String tId) {
        this.tId = tId;
    }
}
测试类:
package com.learn.reflect;
import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import com.learn.pojo.person;
public class ReflectDemo3 {
    public static void main(String[] args)
            throws IntrospectionException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        person p = new person();
        p.setId("0");
        PropertyDescriptor prop = new PropertyDescriptor("id", person.class);
        // 获取getter方法,反射获取id值
        Object str = prop.getReadMethod().invoke(p);
        // 获取setter方法,反射赋值
        prop.getWriteMethod().invoke(p, "1");
        System.out.println("获取ID值:" + str);
        System.out.println("赋值ID:" + p.getId());
    }

     

通过PropertyDescriptor反射获取属性的 getter/setter 方法相关推荐

  1. Java利用PropertyDescriptor获取属性的 getter/setter 方法

    PropertyDescriptor类: PropertyDescriptor类表示JavaBean类通过存储器导出一个属性.主要方法:     1. getReadMethod(),获得用于读取属性 ...

  2. 在vuejs 中使用axios不能获取属性data的解决方法

    在vuejs 中使用axios不能获取属性data的解决方法 参考文章: (1)在vuejs 中使用axios不能获取属性data的解决方法 (2)https://www.cnblogs.com/lo ...

  3. 通过反射获取类的所有属性和方法

    通过反射获取类的所有属性和方法  1    private void button1_Click(object sender, EventArgs e)  2        {  3          ...

  4. 利用Lambda实现通过getter/setter方法引用拿到属性名

    很多开发场景需要用到Java Bean的属性名,直接写死属性名字符串的形式容易产生bug(属性名一旦变化,IDE不会告诉你你的字符串需要同步修改).JDK8的Lambda可以通过方法引用简化代码,同样 ...

  5. java 反射获取属性名和值_阿里P8架构师核心知识点整理:Java基础+spring原理+微服务+算法...

    Java基础 5.1.1. JAVA 异常分类及处理 5.1.1.1. 概念 如果某个方法不能按照正常的途径完成任务,就可以通过另一种路径退出方法.在这种情况下 会抛出一个封装了错误信息的对象.此时, ...

  6. java反射 获取属性_Java反射学习-3 - 反射获取属性,方法,构造器

    1 packagecn.tx.reflect;2 3 importjava.lang.reflect.Constructor;4 importjava.lang.reflect.Field;5 imp ...

  7. 通过反射获取属性以及属性的值

    已经通过反射获取到 Class 对象了,接下来开始获取属性 属性的英文是 Field,所以获取属性的集合方法就是 getFields(): 这里有一个知识点: getField 和 getDeclar ...

  8. Java通过PropertyDescriptor反射获取和操作字段,

    参考: java反射调用getset方法,你还在拼接方法名吗? - 百度文库 如何判断某个类是否有某个注解?_打酱油的葫芦娃的博客-CSDN博客_判断注解 通过PropertyDescriptor反射 ...

  9. Java中getter/setter方法的使用和解析

    1.怎么生成getter方法和setter方法 第一步:在类里面设置几个属性值. 第二布:同时按住alt+insert 快捷键,生产对应属性的setter和getter方法 第三步:选中想要的方法即可 ...

最新文章

  1. python的nan,NaN,NAN
  2. MySQL 事务到底是隔离还是不隔离?
  3. create-react-app 构建的项目使用 mobx (说到底就是为了使用装饰器语法对 babel 做些配置...
  4. 如何测试web服务器性能,如何执行Web服务器性能基准测试?
  5. UIScrollView与分页的联合使用
  6. 在Ubuntu 16.04 使用命令行安装Nvidia CUDA-9.0以及cudnn7
  7. 《纽约邮报》手机客户端推送系统被黑 黑客发送抒情诗
  8. 【Gym-101889 D】Daunting device【分块】
  9. 利用度盘直链解析网页及XDOWN高速下载百度网盘分享资源
  10. 声音信号处理基频检测和时频分析
  11. 驱动开发:BSOD 0x7E(8000003)或命中断点卡住,__security_init_cookie导致
  12. 2016.4.6海淀驾校考试科目二
  13. 通过路由器SF上网设置方法.....
  14. 《刻意练习:如何从新手到大师》安德斯著PDF下载
  15. pandas添加一行数据的方法
  16. 普通最小二乘法( Ordinary Least Square,OLS)
  17. linux待机唤醒_Linux睡眠唤醒机制--Kernel态
  18. C语言gets_s, _getws_s函数了解
  19. mdb数据库转postgresql数据库
  20. C/C++系列之如何实现一个avi格式的播放器

热门文章

  1. Greenplum的工作负载及资源管理
  2. springboot 集成dubbo问题
  3. CAN转以太网在使用中有哪些注意事项?
  4. qt中qlineedit和qtextedit右键菜单翻译成中文
  5. Java安全—CommonsCollections3
  6. 扶不起的cmseasy,伤不起的bennyxu
  7. 沉痛悼念Steve Jobs
  8. 金融危机,既是危也是机!
  9. Android 微信自动抢红包(源码以及apk下载可以参考末文)
  10. oracle修改数据文件个数,Oracle修改数据文件名/移动数据文件