2017-07-13 2 views
3

Q:含まれるクラスの名前が2回表示されるのはなぜですか?外部クラスがジェネリック型の名前に2回表示されるのはなぜですか?

コンテキスト:私は、コードを生成することだし、ソースに書かれたような目標は、フィールドの宣言を取得することです(完全修飾で結構ですが、私は型パラメータを必要とする):test.Foo.Bar<java.lang.String>

package test; 

import java.lang.reflect.Field; 
import java.lang.reflect.Type; 

public class Foo 
{ 
    public static class Bar<TYPE> {} 

    private Bar<String> bar; 

    public static void main(String[] args) throws Exception 
    { 
    Field field = Foo.class.getDeclaredField("bar"); 
    Type genericType = field.getGenericType(); 
    Type type = field.getType(); 

    System.out.println("genericType: " + genericType.getTypeName()); 
    System.out.println("  type: " + type.getTypeName()); 
    } 
} 

出力:

genericType: test.Foo.test.Foo$Bar<java.lang.String> 
     type: test.Foo$Bar 

UPDATE: はあなたの入力のためのみんなに感謝します。この質問は重複しているとマークされているので、私は現在作業中のソリューションover thereを投稿しました。

+2

https://bugs.openjdk.java.net/browse/JDK-8054213を参照の逆コンパイルピース。 – Radiodef

+0

@Radiodef良いキャッチ、その問題は私の質問と同じであるようです。だからバグですか? (答えに変換する) – Zalumon

+1

これはおそらくバグと見なされるべきですが、実際には型の 'String'表現のための標準化された仕様はありません。 ['getTypeName'](http://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Type.html#getTypeName--)は特定の要件を指定しておらず、どちらも' toString '。それはAPIの非常によく開発されたセクションではありません。 – Radiodef

答えて

3

genericTypeはParameterizedTypeImpl

のtoString()メソッドはOWNERTYPEクラスの名前を返すのインスタンス、次いでrawTypeクラス名です。

コード

public String toString() { 
    StringBuilder var1 = new StringBuilder(); 
    if(this.ownerType != null) { 
     if(this.ownerType instanceof Class) { 
      var1.append(((Class)this.ownerType).getName()); //<--- 
     } else { 
      var1.append(this.ownerType.toString()); 
     } 

     var1.append("."); 
     if(this.ownerType instanceof ParameterizedTypeImpl) { 
      var1.append(this.rawType.getName().replace(((ParameterizedTypeImpl)this.ownerType).rawType.getName() + "$", "")); 
     } else { 
      var1.append(this.rawType.getName()); //<------------ 
     } 
また
+1

ありがとうございます。私はまだそれがなぜそれのようなのだろうと思っています。これはどのように便利ですか?目標を達成するにはどうすればいいですか? – Zalumon

+1

彼らはあなたの質問に対して 'System.out.println(" raw type from generic "+((ParameterizedTypeImpl)genericType).getRawType());をチェックしスキップすることができます。 – StanislavL

+0

ParameterizedTypeImplはsunクラスです、私はそれを使用しないことを好むだろう。 – Zalumon

関連する問題