如果我有一个我无法改变的界面和类,看起来像这样:
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(这不太理想,但比我的更好)?
答案 0 :(得分:1)
Java泛型擦除编译时的泛型类型信息。您无法在运行时获取此信息。