如何从Java方法获取返回的对象列表对象类型?

时间:2014-11-19 09:33:09

标签: java list object generics methods

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

public List <cars> getCars() {

// some code here

}

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

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

是否可以显示“汽车”字样?当我读到Type Erasure时,似乎有一种从List中获取Generics的方法,但我看到的例子是String和Integer而不是对象。

Get generic type of java.util.List

由于

1 个答案:

答案 0 :(得分: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 并进行转换来处理案例。例如:

{{1}}