gpt4 book ai didi

java - 如何使用带有泛型参数的 Java 反射

转载 作者:行者123 更新时间:2023-11-30 07:07:31 25 4
gpt4 key购买 nike

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

[错误:未找到方法异常]:方法名称“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 对象中获取它, 直到即使使用 Object 也找不到方法。

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

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

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

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);

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com