【问题标题】:Java create objects of generic type with unknown in compilation type parameterJava创建编译类型参数未知的泛型对象
【发布时间】:2013-05-17 19:39:37
【问题描述】:

我有通用类:

class Field<T> { }

还有一些其他类(我只在运行时知道其类型),例如:

   class A{
      public Date getDate();
      public String getName();
      public Integer getNumber();
   }

我想为所有 get 方法创建类 Field 的实例,T 等于这些 get 方法的返回类型。对于这个例子Field&lt;Date&gt;、Field&lt;String&gt;、Field&lt;Integer&gt;。

有人可以帮忙吗?

【问题讨论】:

  • 如果你打算通过反射来做这件事,并且在运行时,泛型类型根本不重要。你也可以不使用泛型参数。
  • 我不明白你在做什么。编写一个完整的代码示例,即使它无法编译,也能说明您试图实现的目标。
  • 反射不适合这个用例。考虑使用直接暴露方法来获取 getter 的 Introspection。

标签: java generics reflection introspection


【解决方案1】:

我不相信在这种情况下您可以创建 Field 的泛型类型,因为泛型是在编译时检查的,而您只能(通过反射)在运行时获取 A 类声明的方法的返回类型.

【讨论】:

  • 为未知类制作列表的唯一方法是 List> 但这无济于事。
【解决方案2】:

您通常将反射用于仅在运行时才知道的事情。泛型信息在编译时被擦除。因此,虽然在某些情况下您可以将两者混合使用,但并不常见。

我想为所有 get 方法创建类 Field 的实例,T 等于这些 get 方法的返回类型。对于此示例,字段、字段、字段。

从字面上回答你的问题:

Field<Date> dateField = new Field<Date>();
Field<String> nameField = new Field<String>();
Field<Integer> numberField = new Field<Integer>();

【讨论】:

    【解决方案3】:

    要获得 getter,请考虑使用自省而不是反射:它就是为此目的!

    这是一个自动获取 getter 的代码。当心,你也会得到“getClass()”getter!

    for(PropertyDescriptor descriptor :Introspector.getBeanInfo(A.class).getPropertyDescriptors()){
      System.out.println("Getter method :" + descriptor.getReadMethod());
      System.out.println("Return type : " + descriptor.getReadMethod().getReturnType());
      Class<?> c=descriptor.getReadMethod().getReturnType();
    }
    

    }

    输出:

    Getter method :public final native java.lang.Class java.lang.Object.getClass()
    Return type : class java.lang.Class
    Getter method :public java.util.Date A.getDate()
    Return type : class java.util.Date
    Getter method :public java.lang.String A.getName()
    Return type : class java.lang.String
    Getter method :public java.lang.Integer A.getNumber()
    Return type : class java.lang.Integer
    

    然后,您可以轻松地为每个 getter 创建一个字段。对于泛型类型,它在运行时并没有真正意义,但仍然可以在代码生成器中使用它...

    【讨论】:

    • @trognanders 检查库大小,然后考虑是否值得评论“或使用 Commons Beanutils”。在每个答案下
    • @trognanders,不需要时间机器,你可以在 Maven 中查看大小,它与最新更新 200kb+ 的大小几乎相同
    • 更真诚的,有些东西最好留在图书馆。正确的功能比 jar 大小更重要。是否有一些平台仍然在运行 jvm?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-04
    相关资源
    最近更新 更多