如何将Java反射与泛型参数一起使用

如何将Java反射与泛型参数一起使用,java,generics,reflection,Java,Generics,Reflection,我需要对泛型参数使用反射。这里是一个示例类和测试类,说明了我正在尝试做的事情。运行测试时,我发现错误: [错误:找不到方法异常]:方法名称“EST2GMT” 这是我的反射类与泛型 /* * File: MyTransformer.java * Created: Jul 22, 2014 */ package company.online.project.my.transform; import java.lang.reflect.Method; import java.util.Cale

我需要对泛型参数使用反射。这里是一个示例类和测试类,说明了我正在尝试做的事情。运行测试时,我发现错误:

[错误:找不到方法异常]:方法名称“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";
}

}
您正在将GregorianCalendar传递给采用日历的方法。但是在反射中,您没有发现任何接受GregoriaCalendar的方法,即使在普通Java方法调用中,将参数类型的子类的实例传递给方法是合法的

若要查找采用日历的方法,则如果找不到与类完全匹配的方法,请捕获NoSuchMethodException并使用类的超类重试,您可以使用从类对象中获取的超类,直到即使使用对象也找不到该方法为止

此外,还将类对象作为实际参数传递给要使用反射调用的方法

transformer.tranform( "EST2GMT", calendar.getClass())
而是传递实际对象。另外,在s之后调用.getClass以获取返回对象的类

transformer.tranform( "EST2GMT", calendar).getClass()
测试用例仍然会失败,因为返回的实际类型是GregorianCalendar,它不是相同的类日历。这将通过:

Assert.assertEquals( GregorianCalendar.class,
    transformer.tranform( "EST2GMT", calendar ).getClass() );
如果您只想知道它是否是任何类型的日历,那么instanceof就足够了:

Assert.assertTrue(transformer.tranform("EST2GMT", calendar) instanceof Calendar);
您正在将GregorianCalendar传递给采用日历的方法。但是在反射中,您没有发现任何接受GregoriaCalendar的方法,即使在普通Java方法调用中,将参数类型的子类的实例传递给方法是合法的

若要查找采用日历的方法,则如果找不到与类完全匹配的方法,请捕获NoSuchMethodException并使用类的超类重试,您可以使用从类对象中获取的超类,直到即使使用对象也找不到该方法为止

此外,还将类对象作为实际参数传递给要使用反射调用的方法

transformer.tranform( "EST2GMT", calendar.getClass())
而是传递实际对象。另外,在s之后调用.getClass以获取返回对象的类

transformer.tranform( "EST2GMT", calendar).getClass()
测试用例仍然会失败,因为返回的实际类型是GregorianCalendar,它不是相同的类日历。这将通过:

Assert.assertEquals( GregorianCalendar.class,
    transformer.tranform( "EST2GMT", calendar ).getClass() );
如果您只想知道它是否是任何类型的日历,那么instanceof就足够了:

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

即使您正在使用getSuperClass进行搜索,您的测试也会失败,因为它需要日历,但会再次获取GregorianCalendar。使用.getClass.getSuperClass进行了尝试,但仍然会收到该错误。还尝试了testGetMethod中的thid修改部分。也不管用。获取相同的错误我已经添加了更多关于测试出错原因的解释。即使您正在使用getSuperClass搜索,您的测试也将失败,因为它需要日历,但再次获取了GregorianCalendar。使用.getClass.getSuperClass进行了尝试,但仍然会获得该错误。还尝试了testGetMethod中的thid修改部分。也不管用。得到同样的错误我已经添加了更多关于测试错误的解释。