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