如何在泛型参数中使用Java Reflection

肉饼

我需要对通用参数使用反射。这是我要尝试的示例类和测试类。运行测试,出现错误:

[错误:找不到方法异常]:方法名称“ EST2GMT”

这是我的带有泛型的反射类;

/*
 * File: MyTransformer.java
 * Created: Jul 22, 2014
*/

package company.online.project.my.transform;

import java.lang.reflect.Method;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import org.apache.log4j.Logger;

public class MyTransformer< T >
{

Logger LOG = Logger.getLogger( MyTransformer.class );

public T tranform( String functionName, T arg )
{

    try
    {
        Method method = this.getClass().getDeclaredMethod( functionName, arg.getClass() );
        return (T) method.invoke( this, arg );
    }
    catch ( NoSuchMethodException e )
    {
        System.out.println( "[ERROR : Method not found exception] : Method name '" + functionName + "'" );
    }
    catch ( java.lang.IllegalAccessException e )
    {
        System.out.println( "[ERROR : Illegal Access exception] : " + e.getMessage() );
    }
    catch ( java.lang.reflect.InvocationTargetException e )
    {
        System.out.println( "[ERROR : Invocation Target not found exception] : " + e.getMessage() );
    }
    return null;
}

public Date convert2Date( String date )
{
    LOG.debug( "convert2Date function called" );
    return new Date();
}

public Calendar EST2GMT( Calendar estTime )
{
    LOG.debug( "EST2GMT function called :" + estTime.getTime().toString() );
    return new GregorianCalendar( 2013, 0, 31 );
}

public String createcompanyKeys( List<T> values )
{
    LOG.debug( "EST2GMT function called" );
    return "String";
}

}

这是我的测试课:

package company.online.project.my.transform;

import java.lang.reflect.InvocationTargetException;
import java.util.Calendar;
import java.util.GregorianCalendar;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

public class MyTransformerTest
{

MyTransformer transformer;

@Before
public void setUp()
{
    transformer = new MyTransformer();
}

@Test
public void testGetMethod() throws SecurityException, NoSuchMethodException, IllegalArgumentException,
        IllegalAccessException, InvocationTargetException
{
    Calendar calendar = new GregorianCalendar( 2013, 0, 31 );
    Assert.assertEquals( Calendar.class, transformer.tranform( "EST2GMT", calendar.getClass() );
}

}
格特曼

您正在将传递GregorianCalendar给采用的方法Calendar但是通过反射,您找不到任何采用的方法GregorianCalendar,即使在常规Java方法调用中将参数类型的子类的实例传递给方法是合法的也是如此。

要查找采用的方法,Calendar如果找不到与之完全Class匹配的方法,请抓住NoSuchMethodException并尝试使用该类的超类,您可以Class使用该getSuperclass()方法从该对象中获取该超类,直到找不到该超类。即使的方法Object

另外,您正在将Class对象作为实际参数传递给要使用反射调用的方法。

transformer.tranform( "EST2GMT", calendar.getClass())

而是传递实际对象。此外,通话.getClass() ()s到获取类返回的对象。

transformer.tranform( "EST2GMT", calendar).getClass()

测试用例仍然会失败,因为返回的实际类型是GregorianCalendar,而不是同一类Calendar这将通过:

Assert.assertEquals( GregorianCalendar.class,
    transformer.tranform( "EST2GMT", calendar ).getClass() );

如果您只是想知道它是否是Calendarinstanceof就足够了:

Assert.assertTrue(transformer.tranform("EST2GMT", calendar) instanceof Calendar);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Java Reflection,从方法中提取泛型

来自分类Dev

Java Reflection,从方法中提取泛型

来自分类Dev

在Scala Reflection中,如何获取具体子类的泛型类型参数?

来自分类Dev

如何在.NET中使用Reflection区分封闭类型和嵌套类型参数?

来自分类Dev

泛型乐趣:where typeof(List <T>)!= typeof(List <T>),并使用Reflection获得具有泛型参数的泛型方法

来自分类Dev

使用Reflection.PropertyInfo

来自分类Dev

如何在方法参数中使用泛型类型投影?

来自分类Dev

如何在类中使用Comparable作为泛型参数

来自分类Dev

如何在参数需要类中使用泛型

来自分类Dev

如何在Java方法中使用泛型

来自分类Dev

如何在Java中使用泛型实现工厂模式?

来自分类Dev

如何在Java中使用泛型复制数组

来自分类Dev

ConfigurationBuilder,FilterBuilder,Scanners in java reflection

来自分类Dev

如何在Java接口中使用泛型的泛型

来自分类Dev

如何在HashMap中使用泛型?

来自分类Dev

如何在Scala中使用泛型

来自分类Dev

如何在Scala中使用泛型

来自分类Dev

如何在泛型类中使用参数java.lang.reflect.Type分配分配类型

来自分类Dev

如何在C#中使用Reflection检索对子对象的引用?

来自分类Dev

如何在C#中使用Reflection检索对子对象的引用?

来自分类Dev

使用Java Reflection类获取方法

来自分类Dev

使用Java Reflection类获取方法

来自分类Dev

如何在受保护的只读方法上使用Reflection GetMethods

来自分类Dev

如何在基类的方法中使用泛型指定out参数的类型?

来自分类Dev

如何在Arrow函数中使用Typescript泛型添加两个参数

来自分类Dev

如何在函数调用中使用Typescript泛型类构造函数作为参数

来自分类Dev

如何在JAVA泛型中定义使用2个泛型参数扩展Map对象的类型?

来自分类Dev

getClass()返回java.lang.Class [Reflection]

来自分类Dev

getClass()返回java.lang.Class [Reflection]

Related 相关文章

  1. 1

    Java Reflection,从方法中提取泛型

  2. 2

    Java Reflection,从方法中提取泛型

  3. 3

    在Scala Reflection中,如何获取具体子类的泛型类型参数?

  4. 4

    如何在.NET中使用Reflection区分封闭类型和嵌套类型参数?

  5. 5

    泛型乐趣:where typeof(List <T>)!= typeof(List <T>),并使用Reflection获得具有泛型参数的泛型方法

  6. 6

    使用Reflection.PropertyInfo

  7. 7

    如何在方法参数中使用泛型类型投影?

  8. 8

    如何在类中使用Comparable作为泛型参数

  9. 9

    如何在参数需要类中使用泛型

  10. 10

    如何在Java方法中使用泛型

  11. 11

    如何在Java中使用泛型实现工厂模式?

  12. 12

    如何在Java中使用泛型复制数组

  13. 13

    ConfigurationBuilder,FilterBuilder,Scanners in java reflection

  14. 14

    如何在Java接口中使用泛型的泛型

  15. 15

    如何在HashMap中使用泛型?

  16. 16

    如何在Scala中使用泛型

  17. 17

    如何在Scala中使用泛型

  18. 18

    如何在泛型类中使用参数java.lang.reflect.Type分配分配类型

  19. 19

    如何在C#中使用Reflection检索对子对象的引用?

  20. 20

    如何在C#中使用Reflection检索对子对象的引用?

  21. 21

    使用Java Reflection类获取方法

  22. 22

    使用Java Reflection类获取方法

  23. 23

    如何在受保护的只读方法上使用Reflection GetMethods

  24. 24

    如何在基类的方法中使用泛型指定out参数的类型?

  25. 25

    如何在Arrow函数中使用Typescript泛型添加两个参数

  26. 26

    如何在函数调用中使用Typescript泛型类构造函数作为参数

  27. 27

    如何在JAVA泛型中定义使用2个泛型参数扩展Map对象的类型?

  28. 28

    getClass()返回java.lang.Class [Reflection]

  29. 29

    getClass()返回java.lang.Class [Reflection]

热门标签

归档