java - 获取相关的 getter/setter 字段(成员变量)
问题描述
我有一个Field
f
类MyClass
,我想检索相关的 getter/setter,如果它存在的话。我该怎么做呢?
- 我检查了 的方法
Field
,但甚至没有返回 a 的方法Method
。 - 我玩弄了由
BeanInfo
检索Introspector.getBeanInfo(Class<?> beanClass)
。它有一个getPropertyDescriptors()
返回数组的方法PropertyDescriptor
,每个方法都允许通过andPropertyDescriptor
检索 getter 和 setter 。但似乎与. 此外,似乎不可能得到某个(例如,通过将字段名称作为参数进行检索);所以即使如果有办法从. 这不是高性能的。getReadMethod()
getWriteMethod()
Field
PropertyDescriptor
Field
PropertyDescriptor
PropertyDescriptors
注意:我不想依赖命名约定,所以请不要给出摆弄字段名称的答案。毕竟myField
,没有名称getMyField
或仍然是 getter的字段的 getter。isMyField
解决方案
这是我的想法,虽然不完全正确。检查方法名称中是否包含字段名称,以及返回类型和参数参数类型。我觉得如果没有关于字段的 setter/getter 方法的规则。这几乎是不可能的。
@Test
void test_fieldGetterSetter() throws NoSuchFieldException {
Field f = MyClass.class.getDeclaredField("name");
Class<?> declaringClass = f.getDeclaringClass();
Method[] declaredMethods = declaringClass.getDeclaredMethods();
for (Method declaredMethod : declaredMethods) {
String name = declaredMethod.getName();
// Can also check return type, argument type to increase the correctness
if (isFieldNameWithMethodName(f.getName(), name)) {
String format = String.format("Field name is %s and possible method name is %s", f.getName(), name);
System.out.println(format);
}
}
}
private boolean isFieldNameWithMethodName(String fieldName, String methodName) {
if (methodName.toLowerCase().contains(fieldName.toLowerCase())) {
return true;
}
return false;
}
推荐阅读
- sql - 尝试从表格中的日期获取年龄,但没有奏效。错误“ORA-00923:在预期的地方找不到 FROM 关键字”
- html - 覆盖子组件的 CSS
- javascript - Puppeteer 页面加载事件
- javascript - `obj[method].bind(obj)` 与 `Object.getPrototypeOf(obj)[method].bind(obj)` 之间的差异 - 函数绑定语义和机制?
- amazon-web-services - 从不同账户中的不同 VPC 端点访问时,S3 访问被拒绝
- elasticsearch - Elastic Search 公共文档查询
- javascript - 如何设置选择选项等于innerHTML
- sendmail - Shopware6 : 我的订单电子邮件需要很长时间才能发送
- delphi - 如何在设计时合并两个表单类?
- php - 从今天起 5 天的时间戳在 0 点