gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 13:11:36 26 4
gpt4 key购买 nike

如果我有一个无法更改的接口(interface)和类,看起来像这样:

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(这不太理想,但比我得到的更好)?

最佳答案

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

关于java - 如何使用 Java 反射来检查 ParameterizedType 参数是否扩展特定类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22819156/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com