我在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
由于
答案 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}}