bean上的Introspector getBeanInfo,具有通用的实现方法

时间:2013-08-12 08:30:40

标签: java generics interface override javabeans

大家好日子。我正在使用Vaadin并且遇到了BeanItemContainer的问题。我有一个通用接口和一个实现该接口的bean

package ru.package.testpackage;

public class SomeTest {
    interface SomeHavingId<T> {
        T getId();
        void setId(T id);
    }

    class TestBean implements SomeHavingId<Integer> {
        public TestBean(Integer id) {
            this.id = id;
        }
        @Override
        public Integer getId() {
            return id;
        }
        @Override
        public void setId(Integer id) {
            this.id = id;
        }

        private Integer id;
    }
}

问题是BeanItemContainer内的Vaadin使用Introspector.getBeanInfo(TestBean.class)来解析setter和getter来创建属性映射。但是,不是解析Integer getId(),而是java.lang.Object getId()。据我所知,Introspector无法理解以SomeHavingId<Integer>方式实现的接口。

这就是我的问题 - 如果出现以下情况,我应该怎样做才能获得正确的方法签名:

  1. 我无法更改该bean的源代码
  2. 我无法更改Vaadin的源代码

1 个答案:

答案 0 :(得分:1)

不幸的是,问题仍然可以在JRE7中发生,但不可重现。它取决于方法“Method [] java.lang.Class.getMethods()”返回的方法的顺序,如果结果是否正确。

此方法的javadoc说“...返回的数组中的元素没有排序,并且没有按任何特定的顺序排列......”但是introspector使用顺序来创建属性描述符。因此,可能会返回错误的属性描述符。

我遇到了这个问题,但找不到解决方案,甚至没有一种方法可以重现,因为它不会经常发生。