美文网首页
java反射invoke动态调用方法

java反射invoke动态调用方法

作者: 温暖的纯真 | 来源:发表于2019-04-28 11:17 被阅读0次
    @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<Test> getList(Integer page, Integer size, String keywords) {
            int start = (page - 1) * size;
    
            Date endDate =  null;
            Date startDate = null;
    
            String methodName = "testMethod";
    
            list = (List<Test>) testService.invoke("org.basic.service.testService", 
                                      methodName , start, size, keywords);
    
            return list;
        }
    
        /**
         * 反射调用动态方法
         */
        public List<Test> 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动态调用方法

          本文链接:https://www.haomeiwen.com/subject/zuzrnqtx.html