新建线程,通过反射调用方法。
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;}
