通过java中的反射调用Generic方法

时间:2012-05-24 14:14:20

标签: java generics reflection

如何通过java中的反射来调用自定义通用方法?

class Person
{
  public <T> void print(T t)
   {
      System.out.println(t.toString());
   }
}

3 个答案:

答案 0 :(得分:21)

泛型在编译时被擦除,它们只向编译器提供额外信息以确定错误。它们实际上并未更改.class文件中方法的签名。

这意味着您通过Java中的反射调用泛型方法与在Java中调用非泛型方法完全相同,除了指定类型T而不是指定类型Object

关于如何通过反射调用常规方法有很多教程,我不愿意添加另一个;但是,如果您真的需要关于如何通过反射调用方法的指导,请在下面添加注释,我将添加必要的代码。

如果发现事情没有按预期工作,您始终可以在已编译的类文件上运行javap,以验证您是否在参数列表中使用了正确的对象。如果指定<T extends List>类型通用签名,则生成的参数对象可能实际上可能是List对象。

答案 1 :(得分:10)

这适合我。

Method method = Person.class.getMethod("print", Object.class);

method.invoke(new Person(), "this is a string");
method.invoke(new Person(), 273);
method.invoke(new Person(), new Object());

打印

this is a string
273
java.lang.Object@addbf1

当然,这背后的理论在@Edwin's answer.

中得到了很好的解释

答案 2 :(得分:4)

要突出Edwin的答案中给出的观点,我们在泛型中使用扩展:如果你有像

这样的类
GenericHibernateDao<T extends Serializable>

和方法

public T save( T entity ) {};

调用方法使用反射保存你必须使用Serializable类,即你需要使用:

Method method = GenericHibernateDao.class.getMethod(methodName, Serializable.class);

而不是Object.class作为参数,因为我们正在使用

<T extends Serializable>