【问题标题】:How to get a returned List of Objects object type from a Java method?如何从 Java 方法中获取返回的对象列表对象类型?
【发布时间】:2014-11-19 09:33:08
【问题描述】:

我在一个类中有一个 getter 方法,它返回一个对象列表。它看起来像这样:

public List <cars> getCars() {

// some code here

}

这个类除了这个之外还包含一些其他的getter。在另一个类中,我想获取第一个类中包含的所有getter方法,并显示方法的名称和返回的数据类型。

我能够得到上述方法的名称 (getCars) 和它返回的数据类型 (List)。但是,我似乎无法将“汽车”作为列表包含的对象类型。我能得到的最好的是“ObjectType”。有没有办法让“汽车”显示出来?我已经阅读了有关类型擦除以及如何在字节码中删除泛型的信息,因为它仅用于 Java 编译器的好处。我的问题与类型擦除有关吗?

是否可以显示“汽车”一词?当我阅读有关类型擦除的信息时,似乎有一种方法可以从列表中获取泛型,但我看到的示例是针对字符串和整数而不是对象的。

Get generic type of java.util.List

谢谢

【问题讨论】:

  • 目前你是如何“获取”方法的名称的?我假设您在运行时使用反射,但这并不一定很清楚。返回"ObjectType" 的当前代码示例会有所帮助。
  • 在你的问题中你说:我看到的例子是字符串和整数,而不是对象”,字符串和整数是对象,而不是基本类型。
  • @Andrzej Doyle,是的,我正在使用反射。我在“通用方法返回类型”部分关注了 Jenkov 在tutorials.jenkov.com/java-reflection/generics.html 上写的文章。它使用 ParameterizedType type = (ParameterizedType) returnType; Type[] typeArguments = type.getActualTypeArguments();
  • @Joeblade,真的。我是 Java 新手。不是故意用我的术语来混淆你。我的意思是用户定义的对象,例如汽车
  • @user3572079 没问题,我只是想指出用户定义的类和系统定义的类都是对象,以防您认为那里有特殊规则,但实际上没有。唯一的例外是 + 运算符,它在字符串上下文中硬连线到 String(或 toString() 实例方法)。

标签: java list object generics methods


【解决方案1】:

您可以使用标准 Java 反射获取有关方法的(通用)信息:

Class<?> yourClass = Class.forName("a.b.c.ClassThatHasTheMethod");
Method getCarsMethod = yourClass.getMethod("getCars");
Type returnType = getCarsMethod.getGenericReturnType();

现在没有一种特别优雅的方式来处理这个returnType 变量(据我所知)。它可以是普通的Class,也可以是subinterfaces 中的任何一个(例如ParameterizedType,在这种情况下就是这样)。过去,当我这样做时,我只需要使用instanceof 和强制转换来处理这些情况。例如:

if (returnType instanceof Class<?>) {
    Class<?> returnClass = (Class<?>)returnType;
    // do something with the class
}
else if (returnType instanceof ParameterizedType) {
    // This will be the case in your example
    ParameterizedType pt = (ParameterizedType)returnType;
    Type rawType = pt.getRawType();
    Type[] genericArgs = pt.getActualTypeArguments();

    // Here `rawType` is the class "java.util.List",
    // and `genericArgs` is a one element array containing the
    // class "cars".  So overall, pt is equivalent to List<cars>
    // as you'd expect.
    // But in order to work that out, you need
    // to call something like this method recursively, to
    // convert from `Type` to `Class`...
}
else if (...) // handle WildcardType, GenericArrayType, TypeVariable for completeness

【讨论】:

  • 阅读完这篇文章后,我删除了我的答案,因为它可能会产生误导。我在 SO 中学到的另一件事!
  • @Andrzej Doyle。 Thx Andrzej,我现在可以做我想做的了。我不确定发生了什么,但按照你的例子给了我需要的答案。我不确定我事先哪里出错了,但我确信一定有一些用户错误(因为我尝试了很多想法),但你的解释为我澄清了一些事情。谢谢你回答我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
  • 2012-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-19
  • 2020-09-11
相关资源
最近更新 更多