新建线程,通过反射调用方法。
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
/***
* 请求接口限定时间,一秒内未返回认定为接口异常
* String map_string = (String) callMethod(target, methodName , new Class<?>[]{String.class}, new Object[]{ "TYPE_PXZS" } , time ) ;
* @param target 调用方法的当前对象
* @param methodName 方法名称
* @param parameterTypes 调用方法的参数类型
* @param params 参数 可以传递多个参数
* @param time 请求限定时间,秒为单位
* @return String
* @author: cfb
* @date: 2019年11月19日
*
* */
public static Object callMethod(final Object target , final String methodName ,final Class<?>[] parameterTypes,final Object[]params,int time){
ExecutorService executorService = Executors.newSingleThreadExecutor();
FutureTask<String> future = new FutureTask<String>(new Callable<String>() {
public String call() throws Exception {
String value = null ;
try {
Method method = null ;
method = target.getClass().getDeclaredMethod(methodName , parameterTypes ) ;
Object returnValue = method.invoke(target, params) ;
value = returnValue != null ? returnValue.toString().replace(" ", "") : null ;
} catch (Exception e) {
e.printStackTrace() ;
throw e ;
}
return value ;
}
});
executorService.execute(future);
String result = null;
try{
/**获取方法返回值 并设定方法执行的时间为1秒*/
result = future.get(time , TimeUnit.SECONDS );
}catch (InterruptedException e) {
future.cancel(true);
System.out.println("方法执行中断");
}catch (ExecutionException e) {
future.cancel(true);
System.out.println("Excuti on异常");
}catch (TimeoutException e) {
future.cancel(true);
throw new RuntimeException("invoke timeout" , e );
}
executorService.shutdownNow();
return result;
}