2014-01-28 200 views
0

我瀏覽過StackOverflow以找到我面臨的問題的答案。我遇到了很多很好的答案,但仍然沒有回答我的問題。泛型作爲方法返回類型

Get type of a generic parameter in Java with reflection

How to find the parameterized type of the return type through inspection?

Java generics: get class of generic method's return type

http://qussay.com/2013/09/28/handling-java-generic-types-with-reflection/

http://gafter.blogspot.com/search?q=super+type+token

所以這是我想做的事情。 使用反射,我想獲得所有的方法和它的返回類型(非泛型)。 我一直在使用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 
    } 

如何知道返回類型T是否爲泛型? 我沒有奢望在運行時擁有一個對象。 我正在試用Google TypeToken或者使用抽象類來獲取類型信息。 我想聯想TFoogetObject方法爲Bar<Foo>對象。

有人認爲java不保留通用信息。在那種情況下,爲什麼第一次鑄造工作,第二次鑄造沒有。

Object fooObject = new Foo(); 
bar.setObject((Foo) fooObject); //This works 
Object object = 12; 
bar.setObject((Foo) object); //This throws casting error 

任何幫助表示讚賞。

+2

您明白編譯器會丟棄所有類型參數,對不對?在運行時,一個「Bar 」只是一個「Bar」。 –

+0

是的,我知道。有沒有辦法獲得我正在尋找的信息使用'TypeToken'或類似的方法來獲得'getObject'方法的實際返回類型? –

+0

@JigarPatel。所以不,你不明白大衛說什麼。 –

回答

2
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 

也許這就是你正在尋找的。 TypeToken和Invokable來自Google Guava。

€:修復了關於@PaulBellora的註釋的代碼

+0

請注意,新的TypeToken >(){}'很好 - 類標記構造函數用於解析類型參數,例如'new TypeToken (objectOfClassThatResolvesT.getClass()){}'。 –

+0

@ m0ep謝謝。這解決了我的問題。 –

+0

這將如何工作的靜態方法在http://stackoverflow.com/q/30109459/2103767 – bhantol