5

我有通用类:

class Field<T> { }

还有一些其他类(我只在运行时知道它的类型)有很多 get 方法,例如:

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

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

有人可以帮忙吗?

4

3 回答 3

2

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

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

从字面上回答你的问题:

Field<Date> dateField = new Field<Date>();
Field<String> nameField = new Field<String>();
Field<Integer> numberField = new Field<Integer>();
于 2013-05-22T16:49:13.503 回答
1

要获得 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 创建一个字段。对于泛型类型,它在运行时并没有真正意义,但仍然可以在代码生成器中使用它......

于 2013-05-22T16:53:01.420 回答
1

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

于 2013-05-22T16:48:31.283 回答