【问题标题】:java introspection to find member of the classjava自省查找类的成员
【发布时间】:2013-02-22 19:01:47
【问题描述】:

我正在尝试通过名称 memberName 访问 Object 对象的属性。

我试过了:

new PropertyDescriptor(memberName,object.getClass()).getReadMethod().invoke(object);

它适用于我的对象的大多数属性。但是其中一些是布尔值,getter 的形式是 'isValid' 而不是 'getValid',上面的代码会产生 IntrospectionException 错误。

如果可能的话,在不使用更多代码/外部库的情况下,我能做些什么来完成这项工作?


编辑:

是的,很抱歉,我忘了提到我班级成员的名字可能选得不好。它已经是 'boolean isValid' 并且 getter 也是 'isValid'。

【问题讨论】:

  • 您可以查看标准阅读器是否存在,如果不存在,请检查布尔样式的阅读器。或者检查成员的类型并传入适当的名称。
  • 它适用于我,在 java 6 上。你能发一个 SSCCE 吗?

标签: java introspection


【解决方案1】:

它对我来说很好用,documented 这就是它的工作原理:

通过具有 getFoo 和 setFoo 访问器方法,为遵循标准 Java 约定的属性构造 PropertyDescriptor。因此,如果参数名称是“fred”,它将假定编写器方法是“setFred”,而读取器方法是“getFred”(或布尔属性的“isFred”)。请注意,属性名称应以小写字符开头,在方法名称中将大写。

(强调我的。)

示例代码:

import java.beans.*;

public class Test {

    public static void main(String[] args) throws Exception {
        Test test = new Test();
        PropertyDescriptor pd = new PropertyDescriptor("checked", Test.class);
        System.out.println(pd.getReadMethod().invoke(test));
    }

    public boolean isChecked() {
        System.out.println("isChecked called!");
        return true;
    }

    public void setChecked(boolean checked) {
    }
}

我建议你试试我的示例代码,如果这对你有用,那么看看你是否能找到我的代码和你的代码之间的区别。

【讨论】:

  • @Car981: 好吧,我建议你修复你的课程。如果您将变量更改为 valid,是否可以解决问题?另外,变量是否私有?
  • 有没有办法避免改变变量名?
  • @Car981:你确定这确实是问题所在?我刚刚在本地更改了我的示例代码以拥有一个名为 isChecked 的变量,它仍然可以工作......
【解决方案2】:

如果您要访问的属性是公开的,您可以执行以下操作

object.getClass().getDeclaredField(name)

如果属性是私有的,您可以通过以下方式访问它:

object.getClass().getDeclaredField(name).setAccessible(true);   object.getClass().getDeclaredField(name);

【讨论】:

  • 可能是因为如果该字段是私有的(可能是私有的,如果有一个 getter),那么如果不抛出 IllegalAccessException 就无法获取该值。
猜你喜欢
  • 2023-04-07
  • 2020-07-18
  • 2017-04-10
  • 2014-03-01
  • 1970-01-01
  • 2013-12-29
  • 2015-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多