Java反射调用get/set方法,你还在这样用?
之前有些场景下碰到需要用到反射调用JavaBean的get/set方法时都是像以下这种拼接的方式来实现方法的调用。
Article article = new Article();
article.setTitle("这是标题");
article.setPublishTime(LocalDateTime.now());
Class<? extends Article> aClass = article.getClass();
Field[] declaredFields = aClass.getDeclaredFields();
for (Field declaredField : declaredFields) {
String name = declaredField.getName();
String getMethodName = "get" + name.substring(0, 1).toUpperCase(Locale.ROOT) + name.substring(1);
try {
Method method = aClass.getMethod(getMethodName);
Object invoke = method.invoke(article);
System.out.println(name + "=" + invoke);
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
发现上面这种方式只能拿到当前类的属性,想要拿父类的属性还得自己写循环实现。

今天发现一个类Introspector可以获取一个BeanInfo,然后从BeanInfo上获取属性描述符PropertyDescriptor,然后就可以遍历调用其中的readMethod和writeMethod方法来实现对JavaBean的get/set方法调用,具体代码如下。
try {
BeanInfo beanInfo = Introspector.getBeanInfo(article.getClass());
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
Arrays.stream(propertyDescriptors)
.filter(p -> !"class".equals(p.getName()))
.forEach(pd -> {
try {
Method readMethod = pd.getReadMethod();
Object invoke = readMethod.invoke(article);
System.out.println(pd.getName() + "=" + invoke);
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
});
} catch (IntrospectionException e) {
e.printStackTrace();
}
这种方式还会自动把父类的属性也会列出来。如果将上面的filter拿掉会发现多了一个class属性,所以平常使用的时候需要过滤掉class属性。

Java反射调用get/set方法,你还在这样用?的更多相关文章
- 通过Java反射调用方法
这是个测试用的例子,通过反射调用对象的方法. TestRef.java import java.lang.reflect.Method; import java.lang.reflect.In ...
- Java 反射 调用私有域和方法(setAccessible)
Java 反射 调用私有域和方法(setAccessible) @author ixenos AccessibleObject类 Method.Field和Constructor类共同继承了Acces ...
- 利用java反射调用类的的私有方法--转
原文:http://blog.csdn.net/woshinia/article/details/11766567 1,今天和一位朋友谈到父类私有方法的调用问题,本来以为利用反射很轻松就可以实现,因为 ...
- JAVA如何调用C/C++方法
JAVA如何调用C/C++方法 2013-05-27 JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能.解决JAVA对本地操作的 ...
- C#通过反射调用类及方法
反射有个典型的应用,就是菜单的动态加载,原理就是通过反射调用某个窗体(类).下面演示一下通过反射调用类及方法: 1.新建一个类,命名为:ReflectionHelper,代码如下: #region 创 ...
- JAVA反射调用方法
1.用户类 package com.lf.entity; import com.lf.annotation.SetProperty; import com.lf.annotation.SetTable ...
- 使用Java反射优化多个方法调用
有段时间没来写博客了,心里一直念叨空了来,今天有时间来记录一篇.前段时间领导提出优化部分系统模块,根据业务要求系统中有很多产品,产品下面有N个指标,一个指标就对应一个方法,所以系统代码中就是这样一个情 ...
- java反射构建对象和方法的反射调用
Java反射技术应用广泛,其能够配置:类的全限定名,方法和参数,完成对象的初始化,设置是反射某些方法.可以增强java的可配置性. 1.1 通过反射构建对象(无参数): 例如我们使用 ReflectS ...
- Java 反射调用方法 - 不跳过安全检查、跳过安全检查和普通方法性能比较测试
java中反射提供灵活性同时,给运行效率带来了一定影响.写个代码测试一下 package com.xzlf.reflectTest; import java.lang.reflect.Method; ...
- java反射调用某个对象的方法
// 反射调用某个对象的方法 public Object invokeMethod(Object methodObject, String methodName, Object[] args) thr ...
随机推荐
- CMake构建学习笔记8-OpenSceneGraph库的构建
1. 概论 在连续构建了zlib.libpng.libjpeg.libtiff.giflib以及freetype这几个库之后,接下来我们就要来一个大的,构建OpenSceneGraph这样大型库.Op ...
- 【Jmeter】之进行单接口批量压力测试
目录: 一.安装Jmeter 二.接口压力测试 p.p1 { margin: 0; font: 14px ".PingFang SC"; color: rgba(17, 31, 4 ...
- 微前端实践MicroApp
微前端实践 本文主要是关于microApp的实践过程记录 本文主要内容如下: 什么是MicroApp? MicroApp的父子通讯方式以及路由介绍 如何部署相关应用? 安装 npm i @micro- ...
- C#|.net core 基础 - 扩展数组添加删除性能最好的方法
今天在编码的时候遇到了一个问题,需要对数组变量添加新元素和删除元素,因为数组是固定大小的,因此对新增和删除并不友好,但有时候又会用到,因此想针对数组封装两个扩展方法:新增元素与删除元素,并能到达以下三 ...
- QT6框架WebEngine模块之WebEngine总体介绍以及WebEngine能做什么?
QT6框架WebEngine模块之WebEngine总体介绍以及WebEngine能做什么? 简介 本文简略介绍QT6框架WebEngine模块之WebEngine总体介绍以及WebEngine能做什 ...
- Avalonia upgrade from 0.10 to 11.x
Avalonia 从0.10版本升级到11.x版本.由于11.x新版本与旧版本对比发生了破坏性的变化,因此官方给出了升级的攻略可以参考. https://docs.avaloniaui.net/doc ...
- MySQL 切换 Oracle 问题整理
MySQL 通常小写,Oracle 默认大写 ,查询过程中需加双引号,或者直接将MySQL 字段转换成大写 Springboot 配置 oracle连接 spring: datasource: url ...
- 立足信创国产化运维,打造安全可控IT运维管理系统
随着国产化信创应用试点行业的不断扩大,应用信创产品的企事业单位逐渐增多.大多数企业均面临着陌生的国产化环境与产品,其使用习惯和解决问题的方式都面临改变.北京智和信通切实立足用户需求,提供信创运维服务. ...
- CF102411 ICPC 2019-2020 North-Western Russia Regional Contest题解
A Accurate Movement 签到 M Managing Difficulties 签到 B Bad Treap 已知\(y=\sin(x)\),要求给出数组\(a[n]\),满足\(\fo ...
- iotdb时序数据库常见使用命令
docker 安装IOTDB核心代码: #docker启动 docker run -d -p 6667:6667 -p 31999:31999 -p 8181:8181 --name some-iot ...