如何使用Java反射来检查ParameterizedType参数是否扩展了特定的类

时间:2014-04-02 17:49:36

标签: java generics reflection

如果我有一个我无法改变的界面和类,看起来像这样:

public interface ISport<PlayerType extends IPlayer> {
       String getName();
       List<PlayerType> getPlayers();
}

public class TeamSport<PlayerType extends IPlayer> implements ISport<PlayerType>{  

    // constructor and a bunch of other methods

    @Override
    String getName(){
         return this.name;
    }

    @Override
    List<PlayerType> getPlayers(){
          // returns a maintained players list
    }
}

我正在使用对象的反射和getter方法为任何类型的对象构建一组属性。我需要它来执行嵌套,它可以识别属性的属性。

以下方法是属性提取方法的简化(这里只打印属性,在我的实际代码中,我实际上正在使用它们)。还有一个方法isGetter,这里没有显示,它测试方法名称以“get”开头,方法没有参数,也不是void方法。

但是我需要能够识别getPlayers()的返回类型是IPlayers列表,所以我可以获得IPlayers的属性。

public static printAttributes(Class sourceClass){
       for(Method method : sourceClass.getMethods()){
           if(isGetter(method)){
               System.out.println(method.getName());
               if(method.getGenericReturnType() instanceof ParameterizedType){
                    for(Type parameterType : type.getActualTypeArguments()){
                         System.out.println("   Child type: "+parameterType;
                         if(parameterType instanceof Class){
                              printAttributes((Class)parameterType));
                         }
                    }
               }
           }
       }
}

在TeamSport的实例上调用它会产生以下结果:

getName
getPlayers
   Child type: PlayerType

它不会打印任何IPlayer属性。

如何在printAttributes方法中获取这些IPlayer属性?我可以以某种方式从ParameterizedType获取IPlayer吗?或者只是检查是否有任何ParamaterizedType的参数扩展IPlayer(这不太理想,但比我的更好)?

1 个答案:

答案 0 :(得分:1)

Java泛型擦除编译时的泛型类型信息。您无法在运行时获取此信息。