如何从Java方法获取对象类型的返回列表?
我在一个类中有一个getter方法,它返回一个对象列表。它看起来像这样:如何从Java方法获取对象类型的返回列表?,java,list,object,generics,methods,Java,List,Object,Generics,Methods,我在一个类中有一个getter方法,它返回一个对象列表。它看起来像这样: public List <cars> getCars() { // some code here } public List getCars(){ //这里有一些代码 } 该类包含一些其他getter以及这个getter。在另一个类中,我想获取第一个类中包含的所有getter方法,并显示方法的名称和返回的数据类型 我能够获得上述方法的名称(getCars)及其返回的数据类型(List)。但是,我似乎无法
public List <cars> getCars() {
// some code here
}
public List getCars(){
//这里有一些代码
}
该类包含一些其他getter以及这个getter。在另一个类中,我想获取第一个类中包含的所有getter方法,并显示方法的名称和返回的数据类型
我能够获得上述方法的名称(getCars)及其返回的数据类型(List)。但是,我似乎无法将“Cars”作为列表包含的对象类型。我能得到的最好的是“ObjectType”。有没有办法让“汽车”展示出来?我读过关于类型擦除以及如何在字节码中删除泛型的内容,因为它只用于Java编译器。我的问题与类型擦除有关吗
有可能显示“汽车”一词吗?当我读到关于类型擦除的文章时,似乎有一种从列表中获取泛型的方法,但我看到的示例是字符串和整数,而不是对象
谢谢您可以获得关于使用标准Java反射的方法的(通用)信息:
Class<?> yourClass = Class.forName("a.b.c.ClassThatHasTheMethod");
Method getCarsMethod = yourClass.getMethod("getCars");
Type returnType = getCarsMethod.getGenericReturnType();
目前,您如何“获取”该方法的名称?我假设您在运行时使用反射,但这并不一定清楚。返回
“ObjectType”
的当前代码示例会很有帮助。在您的问题中,您指出:我看到的示例是针对字符串和整数而不是对象的”,字符串和整数是对象,而不是基本类型。@Andrzej Doyle,是的,我使用的是反射。我遵循了Jenkov在上写的文章中的“反射”部分泛型方法返回类型“。它使用ParameteredType=(ParameteredType)returnType;type[]typeArguments=type.getActualTypeArguments()@Joeblade,是的。我是Java新手。我不是想用我的术语把你弄糊涂。我指的是用户定义的对象,例如car@user3572079没问题,我想我应该指出,用户定义的类和系统定义的类都是对象,以防你认为有特殊的规则,但没有。唯一的例外是+o硬连线到字符串(或toString()实例方法)的运算符在字符串上下文中。读完这篇文章后,我删除了我的答案,因为它可能会误导人。我在SO中学到了另一件事!@Andrzej Doyle.Thx Andrzej,我现在已经让它做了我想做的事情。我不确定发生了什么,但按照你的例子给了我我我需要的答案。我不确定我之前哪里出了问题,但我确定一定有什么用户错误ror涉及(因为我尝试了很多想法),但你的解释为我澄清了问题。谢谢你回答我的问题。
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