具有参数化类的泛型反射寻找方法

时间:2013-07-22 07:09:39

标签: java generics reflection methods

我有一个有以下签名的课程:

public class MultipleSorting<T extends Enum<?>> {
    private Class<T> criteriaType;
    private T selectedCriteria;

    public MultipleSorting(Class<T> criteriaType) {
        super();
        this.criteriaType = criteriaType;
    }    

    public void setSelectedCriteria(T selectedCriteria) {
        this.selectedCriteria = selectedCriteria;
    }

    public T getSelectedCriteria() {
        return selectedCriteria;
    }

    public Class<T> getCriteriaType(){
        return criteriaType;
    }

    public void setCriteriaType(Class<T> criteriaType){
        this.criteriaType = criteriaType;
    }
}

我将其实例化为new MultipleSorting(ArticleSortField.class);。此处ArticleSortFieldEnum。现在,当我尝试通过反射获取方法MultipleSorting时,setSelectedCriteria中的另一种方法:

Method setSelectedCriteriaMethod = getClass().getDeclaredMethod("setSelectedCriteria",getCriteriaType());

setSelectedCriteriaMethod正在返回null。调试后我发现getCriteriaType()正在返回类ArticleDortField,但setSelectedCriteria方法的参数类型为Enum,这就是反射返回null的原因

此外,如果我将MultipleSorting的签名更改为public class MultipleSorting<T>,则T的{​​{1}}将变为setSelectedCriteria

  • 我该如何解决这个问题?
  • 这种情况是否因类型擦除而发生?我认为Object将被T取代。但无法理解为什么它表现得像这样。类型擦除的工作原理是什么?他们是否用具体实现替换泛型类型?

任何指针对我都非常有用。

1 个答案:

答案 0 :(得分:2)

您的问题的一个可能的解决方法可能是通过调用具有所需类型的Method,然后使用其超类型来查找“setSelectedCriteria”getClass().getDeclaredMethod(...),然后沿着类层次结构向上走,直到找到匹配方法。这不是一个非常漂亮的解决方案,但它可能会成功。

是的,这是由类型擦除引起的。编译代码后,没有<T>,只有Object,没有<T extends Enum<?>>,只有Enum。类型安全性是由编译器检查的,但不是由JVM强制执行的。