Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从Java方法获取对象类型的返回列表?_Java_List_Object_Generics_Methods - Fatal编程技术网

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

如何从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)。但是,我似乎无法

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

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