java反射invoke动态调用方法

@Service
@Transactional(rollbackFor = Exception.class)
public class testService {
    @Autowired
    TestMapper testMapper;

    /**第一步*/
    private static TestService testService;
    /**第二步*/
    @PostConstruct 
    public void init(){
        testService = this;
        testService.testMapper = this.testMapper;
    }

    public List getList(Integer page, Integer size, String keywords) {
        int start = (page - 1) * size;

        Date endDate =  null;
        Date startDate = null;

        String methodName = "testMethod";

        list = (List) testService.invoke("org.basic.service.testService", 
                                  methodName , start, size, keywords);

        return list;
    }

    /**
     * 反射调用动态方法
     */
    public List testMethod(Integer start, Integer size, String keywords){
        List list = null;
        try {
        /**第三步*/
            list = testService.testMapper.getListByPage(start, size, keywords);
        }catch (NullPointerException e){
            e.printStackTrace();
        }
        return  list;
    }
    /**
     * 方法反射
     * @param className
     * @param methodName
     * @param params
     * @return
     */
    public static Object invoke(String className, String methodName, Object...params){
        try {

            Class c = Class.forName(className);
            Object obj = c.newInstance();
            Method[] methods = c.getDeclaredMethods();
            Method callMethod = null;
            for(Method method:methods){
                if(method.getName().equals(methodName)){
                    callMethod = method;
                    break;
                }
            }
            callMethod.setAccessible(true);
            return callMethod.invoke(obj, params);

        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return  null;
    }

@Autowired标签自动注入TestMapper失败,可能出现的空指针报错:

java.lang.NullPointerException

解决:注意代码中标明的第一步,第二步,第三步

从Java EE5规范开始,Servlet增加了两个影响Servlet生命周期的注解(Annotation):@PostConstruct和@PreConstruct。这两个注解被用来修饰一个非静态的void()方法.而且这个方法不能有抛出异常声明。

被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器调用一次,类似于Serclet的inti()方法。被@PostConstruct修饰的方法会在构造函数之后,init()方法之前运行。

被@PreDestroy修饰的方法会在服务器卸载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的destroy()方法。被@PreDestroy修饰的方法会在destroy()方法之后运行,在Servlet被彻底卸载之前。

你可能感兴趣的:(java反射invoke动态调用方法)