JAva:ParameterizedType Impl.toString()のバグ
4426 ワード
oracle JDKにおける
内蔵汎用クラスtoStringメソッドに表示される内容が正しくありません:次のコードは、
これは古い問題です.javaの公式サイトにもこのバグが報告されています.
https://bugs.java.com/bugdatabase/view_bug.do?bug_id=6376382
しかし、卵を並べて、jdk 1.7から1.8までこのバグが存在します(私は1.9を装っていません.解決するかどうか分かりません)パラメータizedType-Implのソースコードを見てみると、この問題は非常によく解決されています.プログラマーの誤記です.
これは非常に小さなバグで、あなたのプロジェクトで注目しなければ過去になります.しかし、それを変更するには、
テストコード参照:ParameterizedType Test.java
ParameterizedType
インタフェースの実装クラスsun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
のtoString
メソッドにはバグがある.内蔵汎用クラスtoStringメソッドに表示される内容が正しくありません:次のコードは、
java.util.Map.entrySet()
メソッドの戻りタイプを返します.Type returnType = java.util.Map.class.getMethod("entrySet").getGenericReturnType();
System.out.println(returnType);
entrySet()
メソッドの戻りタイプはSet>
であるべきであることを知っていますが、上記のコードの実行結果はjava.util.Set.util.Map.java.util.Map$Entry>
これは古い問題です.javaの公式サイトにもこのバグが報告されています.
https://bugs.java.com/bugdatabase/view_bug.do?bug_id=6376382
しかし、卵を並べて、jdk 1.7から1.8までこのバグが存在します(私は1.9を装っていません.解決するかどうか分かりません)パラメータizedType-Implのソースコードを見てみると、この問題は非常によく解決されています.プログラマーの誤記です.
Class.getSimpleName()
でClass.getName()
の方法を誤って使用しています.その結果、次のtoString()
の方法の注釈を参照してください. public String toString() {
StringBuilder sb = new StringBuilder();
if (ownerType != null) {
if (ownerType instanceof Class)
sb.append(((Class)ownerType).getName());
else
sb.append(ownerType.toString());
sb.append(".");
if (ownerType instanceof ParameterizedTypeImpl) {
// Find simple name of nested type by removing the
// shared prefix with owner.
sb.append(rawType.getName().replace( ((ParameterizedTypeImpl)ownerType).rawType.getName() + "$",
""));
} else
// getSimpleName
sb.append(rawType.getName());
} else
sb.append(rawType.getName());
if (actualTypeArguments != null &&
actualTypeArguments.length > 0) {
sb.append(");
boolean first = true;
for(Type t: actualTypeArguments) {
if (!first)
sb.append(", ");
if (t instanceof Class)
sb.append(((Class)t).getName());
else
sb.append(t.toString());
first = false;
}
sb.append(">");
}
return sb.toString();
}
これは非常に小さなバグで、あなたのプロジェクトで注目しなければ過去になります.しかし、それを変更するには、
ParameterizedType
のインプリメンテーションを自分で書かなければなりません.そのため、私はこの小さなバグを解決するためにParameterizedTypeImpl.javaを書きました.完全なコードはgitee倉庫:ParameterizedTypeImpl.javaを参照してください.テストコード参照:ParameterizedType Test.java