【问题标题】:Call a Generic method by reflection in java在java中通过反射调用通用方法
【发布时间】:2012-05-24 14:14:19
【问题描述】:

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

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

【问题讨论】:

    标签: java generics reflection


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 确实,对不起。我会删除评论
    【解决方案2】:

    这对我有用。

    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.中有很好的解释

    【讨论】:

      【解决方案3】:

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

      这样的类
      GenericHibernateDao<T extends Serializable>
      

      ,还有一个方法

      public T save( T entity ) {};
      

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

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

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

      <T extends Serializable>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-21
        • 2019-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-25
        相关资源
        最近更新 更多