繁体   English   中英

在java中通过反射调用通用方法

[英]Call a Generic method by reflection in java

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

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

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

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

关于如何通过反射调用常规方法的教程太多了,我犹豫再添加一个; 但是,如果您确实需要有关如何通过反射调用方法的指导,请在下面添加评论,我将添加必要的代码。

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

这对我有用。

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 的回答很好地解释了这背后的理论。

为了突出埃德温的回答中给出的观点,我们在泛型类型中使用扩展:如果你有一个像这样的类

GenericHibernateDao<T extends Serializable>

, 和一个方法

public T save( T entity ) {};

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

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

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

<T extends Serializable>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM