当前位置: 首页 > 面试题库 >

通过反射调用吸气剂的最佳方法

洪捷
2023-03-14
问题内容

我需要获取具有特定批注的字段的值,因此通过反射,我能够获取此Field
Object。问题在于,尽管我事先知道它将始终具有getter方法,但该字段将始终是私有的。我知道我可以使用setAccesible(true)并获取其值(当没有PermissionManager时),尽管我更喜欢调用其getter方法。

我知道可以通过查找“ get + fieldName”来查找该方法(尽管例如,我知道布尔字段有时被命名为“ is + fieldName”)。

我想知道是否有更好的方法来调用此getter(许多框架使用getter / setter访问属性,所以也许它们以另一种方式使用)。

谢谢


问题答案:

我认为这应该为您指明正确的方向:

import java.beans.*

for (PropertyDescriptor pd : Introspector.getBeanInfo(Foo.class).getPropertyDescriptors()) {
  if (pd.getReadMethod() != null && !"class".equals(pd.getName()))
    System.out.println(pd.getReadMethod().invoke(foo));
}

请注意,您可以自己创建BeanInfo或PropertyDescriptor实例,即无需使用Introspector。但是,Introspector在内部进行一些缓存,这通常是一件好事(tm)。如果没有缓存就很开心,甚至可以去

// TODO check for non-existing readMethod
Object value = new PropertyDescriptor("name", Person.class).getReadMethod().invoke(person);

但是,有很多库可以扩展和简化java.beans API。Commons BeanUtils是一个众所周知的示例。在那里,您只需执行以下操作:

Object value = PropertyUtils.getProperty(person, "name");

BeanUtils附带了其他方便的东西。即即时值转换(对象到字符串,字符串到对象)以简化用户输入的设置属性。



 类似资料:
  • 问题内容: 有人可以帮助我迅速了解正确使用吸气剂和吸气剂的方法。我对它的印象与说Java不一样。 这是Swift中用于存储和访问类变量的正确用法吗? 问题答案: 斯威夫特提供了更结构化的方法来和比Java。 你可以,但你应该 不会 ,写getter和setter方法就像你在你的代码一样。 相反,(如果您使用)只需声明可见性为non的属性即可(例如,在我的示例中)。这样,您班级外的呼叫者将可以查看属

  • 问题内容: 我在读这篇文章,了解为什么和邪恶。本文没有说过 不要 使用它们,而是告诉您以限制使用这些方法的方式进行思考,或者引用该文章: 不要要求您进行工作所需的信息;询问具有信息的对象为您完成工作。 当您需要在GUI中显示数据但没有getter方法时会发生什么?本文简要介绍了这一点,但并不完整。它提到将JComponent传递给类,但是如果您要进行GUI更改,则可能需要进行很多工作才能修复。 例

  • 问题内容: 我想在两次调用getter和setter之后编写我的业务逻辑,因为我在业务逻辑中使用了它们的对象值。但是,在吸气剂之前调用了Construct,Post构造,actionevents..。 那么,如果我不想在内部获取业务逻辑,该如何使用它们的值呢? 问题答案: 我想导航到该站点并从显示在outputText中的数据库中获取数据。 在bean的(后)构造函数中执行该工作。 与 当我更改(

  • 我按照时间表使用VUE,我对VUE和JS非常陌生。我创建了VUE组件,它将一些新属性添加到已经处于状态的对象中,然后我将这个对象与getter一起呈现在我的另一个VUE组件中,但不幸的是,新属性仅在重新加载后呈现。这是我添加新属性的组件片段 这是国务院的一个片段 以下是操作 这是突变,它完成了所有的工作 吸气剂 这里是计算属性,它从getters中获取时间表 所以问题是我不能使吸气剂反应,但我看到

  • 问题内容: 我有一堂课,看起来像下面这样: 我的hibernate映射文件按如下所示映射属性: 我收到以下错误: 看来hibernate不喜欢我的大写字母。我该如何解决? 问题答案: 应该管用…

  • 问题内容: 我有以下页面: 当我单击“ gameSelector”按钮时,事件的顺序如下:1. gameBean.getGameId和gameBean.getHtmlPage被称为2. gameBean.changeGame被称为3.页面被刷新。 我的问题按1和2的顺序排列。changeGame修改了getGameId和getHtmlPage使用的gameBean变量。因此,我想先执行它,以便刷新