java - 如何将 Java 反射与通用参数一起使用

标签 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.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 > 并重试该类的父类(super class),您可以使用 getSuperclass() methodClass 对象获取该父类(super class)。 ,直到即使使用 Object 也找不到该方法。

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

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

改为传递实际对象。另外,在 () 之后调用 .getClass() 来获取返回对象的类。

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

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

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

如果您只是想知道它是否是任何类型的日历,一个instanceof就足够了:

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

关于java - 如何将 Java 反射与通用参数一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24896611/

相关文章:

generics - 当泛型类型受到泛型生存期的限制时,这意味着什么?

c# - 无法将通过反射创建的类添加到容器中

java - JSP 通常作为 .jsp 文件、预编译的 Java 文件或预编译的类文件提供吗?

java - 如何在 JavaFX 中获得窄进度条?

java - 带通配符的 Pagefactory 动态 WebElement

c# - “T”不包含定义

java - 为什么不需要用泛型内部类参数化?

java - Hibernate session.load() 不适用于 Java 反射 getDeclaredFields?

java - 为什么 isAnnotationPresent 在 Java 7 和 Java 8 之间的工作方式不同?

java - 我的 .txt 文件应使用什么路径才能让 FileReader 读取它?