我有一个通用类:
class Field<T> { }
和其他一些类(其类型我只在运行时知道)有许多get方法,例如:
class A{
public Date getDate();
public String getName();
public Integer getNumber();
}
我想为所有get方法创建类Field
的实例,其中T
等于这些get
方法的返回类型。本例为Field<Date>
, Field<String>
, Field<Integer>
。
有人能帮忙吗?
您通常将反射用于仅在运行时才知道的事情。泛型信息在编译时被擦除。因此,虽然在某些情况下可以将两者混合使用,但这并不常见。
我想为所有get方法创建类Field的实例,其中T等于这些get方法的返回类型。本例为Field, Field, Field.
从字面上回答你的问题:
Field<Date> dateField = new Field<Date>();
Field<String> nameField = new Field<String>();
Field<Integer> numberField = new Field<Integer>();
我不相信您可以在这种情况下创建Field的泛型类型,因为泛型是在编译时检查的,而您只能在运行时获得(通过反射)类A声明的方法的返回类型。
要获得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创建一个Field。对于泛型类型,它在运行时实际上没有意义,但仍然可以在代码生成器中使用它…