Java 泛型方法作为返回类型

Java 泛型方法作为返回类型,java,generics,reflection,Java,Generics,Reflection,我已经环顾了StackOverflow,以找到我所面临问题的答案。我得到了很多好的答案,但仍然没有回答我的问题 这就是我想做的。 使用反射,我希望获得所有方法及其返回类型(非泛型)。 我一直在使用Introspector.getBeanInfo这样做。然而,当我遇到返回类型未知的方法时,我遇到了限制 public class Foo { public String name; public String getName() { return name

我已经环顾了StackOverflow,以找到我所面临问题的答案。我得到了很多好的答案,但仍然没有回答我的问题

这就是我想做的。 使用反射,我希望获得所有方法及其返回类型(非泛型)。 我一直在使用
Introspector.getBeanInfo
这样做。然而,当我遇到返回类型未知的方法时,我遇到了限制

public class Foo {

    public String name;

    public String getName() {
        return name;
    }

    public void setName(final String name) {
        this.name = name;
    }
}

public class Bar<T> {

    T object;

    public T getObject() {
        return object;
    }

    public void setObject(final T object) {
        this.object = object;
    }
}

@Test
    public void testFooBar() throws NoSuchMethodException, SecurityException, IllegalAccessException,
            IllegalArgumentException, InvocationTargetException {

        Foo foo = new Foo();
        Bar<Foo> bar = new Bar<Foo>();
        bar.setObject(foo);
        Method mRead = bar.getClass().getMethod("getObject", null);

        System.out.println(Foo.class);// Foo
        System.out.println(foo.getClass());// Foo
        System.out.println(Bar.class);// Bar
        System.out.println(bar.getClass());// Bar
        System.out.println(mRead.getReturnType()); // java.lang.Object
        System.out.println(mRead.getGenericReturnType());// T
        System.out.println(mRead.getGenericReturnType());// T
        System.out.println(mRead.invoke(bar, null).getClass());// Foo
    }
感谢您的帮助。

Bar=newbar();
Bar<Foo> bar = new Bar<Foo>();
Method mRead = bar.getClass().getMethod( "getObject", null );
TypeToken<Bar<Foo>> tt = new TypeToken<Test.Bar<Foo>>() {};
Invokable<Bar<Foo>, Object> inv = tt.method( mRead );
System.out.println( inv.getReturnType() ); // Test$Foo
方法mRead=bar.getClass().getMethod(“getObject”,null); TypeToken tt=新的TypeToken(){}; 可调用inv=tt.method(mRead); System.out.println(inv.getReturnType());//测试$Foo
也许这就是你正在寻找的。 TypeToken和Invokable来自Google Guava


欧元:修复了关于@PaulBellora注释的代码

您知道编译器会丢弃所有类型参数,对吗?在运行时,
Bar
只是一个
Bar
。是的,我知道这一点。有没有一种方法可以通过使用
TypeToken
或类似的方法来获取我想要的信息,以获取
getObject
方法的实际返回类型?没有。曾经时期您无法检索它。您还没有显示什么代码在运行时失败或如何失败。@JigarPatel请编辑该问题,以准确地提供演示该问题的代码,如果抛出异常堆栈跟踪,则提供异常堆栈跟踪。请注意,
new TypeToken(){}
很好-类令牌构造函数用于解析类型参数,例如,
newTypeToken(ObjectOfClasshatResolvest.getClass()){}
。这对中的静态方法如何工作
Bar<Foo> bar = new Bar<Foo>();
Method mRead = bar.getClass().getMethod( "getObject", null );
TypeToken<Bar<Foo>> tt = new TypeToken<Test.Bar<Foo>>() {};
Invokable<Bar<Foo>, Object> inv = tt.method( mRead );
System.out.println( inv.getReturnType() ); // Test$Foo