2016-04-15 12 views
4

Java 8(JDK 1.8.0_71)およびMockito(バージョン2.0.44-beta)を使用して、特定のリフレクションコールで奇妙な結果が得られました。Java 8のgetGenericReturnTypeによる出力が正しくありません

次の呼び出し:

org.mockito.BDDMockito.org.mockito.BDDMockito$BDDMyOngoingStubbing<T> 

これは、(パッケージが存在しない)、右見ていない、と私は他のJavaでこの問題を見ていない:

BDDMockito.class.getMethod("given", Object.class).getGenericReturnType().getTypeName() 

は、この誤った結果を与えますクラスまたはBDDMockitoの他のメソッドを使用しています。結果は次のようになるはずです。

org.mockito.BDDMockito$BDDMyOngoingStubbing<T> 

私の得た結果についての説明はありますか?これは既知の問題ですか、それともOracleに報告する必要がありますか?

答えて

3

はい、これはバグです。これはチケットJDK-8054213で報告されており、現在のバージョン(現在のJDK 9ベータ版を含む)では未解決です。

もっと簡単な例で再現できることに注意してください。この問題は、メソッドの戻り型としてネストされたクラスを使用することで発生します。 getGenericReturnTypeは、出力でクラス名を間違って繰り返します。これは、静的なネストされたクラスまたは内部クラスで再現可能です。

package parent; 

public class Main { 

    public static void main(String[] args) throws Exception { 
     System.out.println(Main.class.getMethod("bar").getGenericReturnType()); 
     // prints "parent.Main.parent.Main$Bar<T>" 
    } 

    public <T> Bar<T> bar() { 
     return null; 
    } 

    /*static*/ class Bar<T> {} 

} 
+1

これはとてもイライラしています。それは2014年に報告されました。それは[ここにあります](http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/sun/reflect/generics/reflectiveObjects/ParameterizedTypeImpl)。 java#223)。 223行目は 'getSimpleName()'の代わりに 'getName()'を使います。 – Radiodef

関連する問題