新建线程,通过反射调用方法。

    1. import java.util.concurrent.Callable;
    2. import java.util.concurrent.ExecutionException;
    3. import java.util.concurrent.ExecutorService;
    4. import java.util.concurrent.Executors;
    5. import java.util.concurrent.FutureTask;
    6. import java.util.concurrent.TimeUnit;
    7. import java.util.concurrent.TimeoutException;
    8. /***
    9. * 请求接口限定时间,一秒内未返回认定为接口异常
    10. * String map_string = (String) callMethod(target, methodName , new Class<?>[]{String.class}, new Object[]{ "TYPE_PXZS" } , time ) ;
    11. * @param target 调用方法的当前对象
    12. * @param methodName 方法名称
    13. * @param parameterTypes 调用方法的参数类型
    14. * @param params 参数 可以传递多个参数
    15. * @param time 请求限定时间,秒为单位
    16. * @return String
    17. * @author: cfb
    18. * @date: 2019年11月19日
    19. *
    20. * */
    21. public static Object callMethod(final Object target , final String methodName ,final Class<?>[] parameterTypes,final Object[]params,int time){
    22. ExecutorService executorService = Executors.newSingleThreadExecutor();
    23. FutureTask<String> future = new FutureTask<String>(new Callable<String>() {
    24. public String call() throws Exception {
    25. String value = null ;
    26. try {
    27. Method method = null ;
    28. method = target.getClass().getDeclaredMethod(methodName , parameterTypes ) ;
    29. Object returnValue = method.invoke(target, params) ;
    30. value = returnValue != null ? returnValue.toString().replace(" ", "") : null ;
    31. } catch (Exception e) {
    32. e.printStackTrace() ;
    33. throw e ;
    34. }
    35. return value ;
    36. }
    37. });
    38. executorService.execute(future);
    39. String result = null;
    40. try{
    41. /**获取方法返回值 并设定方法执行的时间为1秒*/
    42. result = future.get(time , TimeUnit.SECONDS );
    43. }catch (InterruptedException e) {
    44. future.cancel(true);
    45. System.out.println("方法执行中断");
    46. }catch (ExecutionException e) {
    47. future.cancel(true);
    48. System.out.println("Excuti on异常");
    49. }catch (TimeoutException e) {
    50. future.cancel(true);
    51. throw new RuntimeException("invoke timeout" , e );
    52. }
    53. executorService.shutdownNow();
    54. return result;
    55. }