java - 带有参数化类的泛型类型的反射查找方法

标签 java generics reflection methods

我有一个具有以下签名的类(class):

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()正在返回类(class) ArticleDortFieldsetSelectedCriteria 的参数类型方法是Enum ,这就是反射返回 null 的原因.

此外,如果我更改 MultipleSorting 的签名如public class MultipleSorting<T>然后TsetSelectedCriteria正在成为Object .

  • 如何解决该问题?
  • 这是由于类型删除而发生的吗?我以为T将被 ArticleDortField 取代。但无法理解为什么它会这样。类型删除究竟是如何工作的?他们是否用具体实现替换了泛型类型?

任何指针都会对我非常有帮助。

最佳答案

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

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

关于java - 带有参数化类的泛型类型的反射查找方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17781785/

相关文章:

java - 从 java-me 内部类调用其他实例方法

java - 谷歌Codelab错误

java - 带短语替代的正则表达式

Java 从通用列表动态向下转型

java - 泛型类型列表的正确类型签名?

java - 使用Java反射加载接口(interface)

java - 使流平行于 flatMap 的结果

java - 泛型方法的不同返回类型取决于调用位置

c# - 使用反射获取未由接口(interface)实现的对象的所有属性

Java:Java 是否在幕后将方法参数转换为数组?