我需要对通用参数使用反射。这是我要尝试的示例类和测试类。运行测试,出现错误:
[错误:找不到方法异常]:方法名称“ 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() );
如果您只是想知道它是否是Calendar
,instanceof
就足够了:
Assert.assertTrue(transformer.tranform("EST2GMT", calendar) instanceof Calendar);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句