【问题标题】:Why does the outer class appear twice in the generic type name? [duplicate]为什么外部类在泛型类型名称中出现两次? [复制]
【发布时间】:2017-07-13 14:11:27
【问题描述】:

问:为什么包含类的名字出现两次?

上下文:我正在生成代码,目标是获取字段的声明,如源代码中所写(完全限定是可以的,但我需要类型参数):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

更新: 谢谢大家的意见。由于这个问题被标记为重复,我发布了我当前的工作解决方案over there

【问题讨论】:

  • @Radiodef 很好,这个问题似乎与我的问题相同。所以这是一个错误? (转换为答案)
  • 它可能应该被认为是一个错误,但对于String 类型的表示并没有真正的标准化规范。 getTypeName 没有指定任何特定要求,toString 也没有。它不是 API 中一个非常完善的部分。

标签: java reflection code-generation


【解决方案1】:

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()); //<------------
        }

【讨论】:

  • 感谢您的调查。我仍然想知道为什么会这样。这有什么用?我怎样才能实现我的目标?
  • 他们尝试提供更多信息 - 对于您的问题,您可以检查并跳过` System.out.println("raw type from generic: " + ((ParameterizedTypeImpl)genericType).getRawType()); `
  • ParameterizedTypeImpl 是一个 sun 类,我不想使用它。
  • 类型是一个接口,实现可以依赖于平台或虚拟机。
  • @Zalumon 你不需要ParameterizedTypeImpl,用它的JDK接口ParameterizedType就行了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-30
  • 2021-08-11
  • 1970-01-01
相关资源
最近更新 更多