Java内省的学习

news/2024/5/19 5:19:42 标签: java, 反射

内省

内省是与反射类似的技术,它是以规范化的Java bean为模板,将类中的成员变量和getter、setter方法关联起来
它的一般用法是:
使用Java反射解析Java类的结构,把字段和该字段对应的setter、getter方法关联起来,封装到PropertyDescriptor(属性描述器)中。通过属性描述器可以直接获得该字段的setter、getter方法的Method对象,进而根据实际需要进行操作。

关于内省中常用类或方法的介绍与常见使用:

  • BeanInfo

Use the BeanInfo interface to create a BeanInfo class and provide explicit information about the methods, properties, events, and other features of your beans.
使用BeanInfo接口创建一个BeanInfo类,并提供关于bean的方法、属性、事件和其他特性的明确信息。

  • Introspector

The Introspector class provides a standard way for tools to learn about the properties, events, and methods supported by a target Java Bean.
内省类为工具提供了一种标准的方法来了解目标Java Bean所支持的属性、事件和方法。

  • PropertyDescriptor

PropertyDescriptor描述了通过一对访问器方法导出的Java Bean的一个属性。

常用方法:
getPropertyType():获取属性的数据类型
getReadMethod():获取属性的get方法
getWriteMethod() :获取属性的set方法

  • MethodDescriptor

常用方法:
getMethod():获取方法描述器中的方法

以下是代码:

java">public class User implements Serializable {
    private static final long serialVersionUID = -3015143840907090098L;
    private String name;
    private String age;

    public User(String name, String age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

}
Class clazz=User.class;
Object obj=clazz.newInstance();

BeanInfo bean = Introspector.getBeanInfo(clazz); 

PropertyDescriptor[] descriptors =bean .getPropertyDescriptors();
for (PropertyDescriptor propertyDescriptor : descriptors) {
    //我是试验时 这里输出属性名 多了class 应该是来自于Object
    //而serialVersionUID则没有输出 这跟getDeclaredFields()有些区别
    System.out.println(propertyDescriptor.getName());  
    //获得属性的set方法,并给出参数调用
    Method writeMethod = propertyDescriptor.getWriteMethod(); 
    writeMethod.invoke(obj, args);
    //获得属性的get方法,并调用
    Method readMethod = propertyDescriptor.getReadMethod();
    readMethod.invoke(obj);
}
MethodDescriptor[] methods = bean.getMethodDescriptors();
for (MethodDescriptor methodDescriptor : methods ) {
//获得了Method对象 就跟反射中的操作类似了
    Method method=methodDescriptor.getMethod();
}

以上若有解释不当或错误,请指出,谢谢!


http://www.niftyadmin.cn/n/551130.html

相关文章

云原生应用的12要素

文章目录简介背景云原生应用的12要素I. 基准代码一份基准代码(_Codebase_),多份部署(_deploy_)II. 依赖显式声明依赖关系( _dependency_ )III. 配置在环境中存储配置IV. 后端服务把后端服务(_ba…

文件下载_断点续传_进度查看

大家平时在做与网络有关的App的时候,难免都会用到下载功能,断点续传、查看下载进度的功能再所难免。 网上关于这样的代码例子也还是不少,但苦于各位苦命的程序员工作繁忙,无暇去寻找, 我特此献上我的Demo一个&#xff…

Apache Beanutils的使用

Beanutils的常见用法 由于我们在使用Java 原生api处理反射或内省操作时会比较麻烦,所以也就催生出了该api的产生。该api具备简化代码,提高代码可读性等优点。下面着重介绍该api中常用方法的使用 笔者建立的是maven项目,所以将gav展示如下&am…

【059】分享我的 Android 应用

Android 手机空间不够解析: 首先是 DCIM 中的缓存文件!其次是豌豆荚中的源程序!还可能是酷狗中下载的歌曲!China Mobile Samsung GT-I9100上安装的应用 ABC News ABC News Ask.com Ask.com BBC News BBC Worldwide Limited Camera…

Docker Hub 镜像加速器列表

镜像加速器镜像加速器地址Docker 中国官方镜像https://registry.docker-cn.comDaoCloud 镜像站http://f1361db2.m.daocloud.ioAzure 中国镜像https://dockerhub.azk8s.cn科大镜像站https://docker.mirrors.ustc.edu.cn阿里云https://<your_code>.mirror.aliyuncs.com七牛…

Android开发人员的薪资调查

Android开发人员的薪资调查可留言加上自己的工作年限&#xff01;&#xff01;&#xff01;背景&#xff1a;大家不要灰心&#xff0c;看到盛大那个哥们还有别的很多哥哥说他们搞开发都基本10K以上&#xff0c;其实我是很高兴的&#xff0c;至少我觉得如果我努力了&#xff0c;…

关注Spring Cloud Greenwich.SR3 新的loadbalancer实现和gateway的新功能

关注SR3 新的loadbalancer实现和gateway的新功能 Spring Cloud Greenwich.SR3 Released

maven 打包 时出现非法字符: /65279错误

maven 打包 时出现非法字符&#xff1a; /65279错误 在用命令对项目进行打包操作时&#xff08;clean package&#xff09;&#xff0c;报出在某文件的第一行第一个字符出现非法字符问题。 尝试了一种方式&#xff1a;将该文件另存为&#xff0c;选择编码方式改为UTF-8无BOM…