Java通过注解获取方法反射运行


//上下文
@Resource
private ApplicationContext applicationContext;

@Bean
public void test(){
    //扫描Controller
    Reflections reflections = new Reflections("com.xzc.test.controller");
    //获取所有注解为@controller的类
    Set<Class<?>> clazzs = reflections.getTypesAnnotatedWith(Controller.class);
    for (Class<?> clazz : clazzs) {
        //获取所有方法
        Method[] methods = clazz.getDeclaredMethods();
        for (Method method : methods) {
            //获取注解为@Test的方法
            if(method.isAnnotationPresent(Listener.class)){
                //获取Test(自定义)注解
                Test test= method.getAnnotation(Test.class);
                //获取注解参数
                String value = test.value();
                try {
                    //从上下文中获取对象,如果直接使用clazz.则无法使用ioc
                    Object bean = applicationContext.getBean(clazz);
                    applicationContext.getAutowireCapableBeanFactory().autowireBean(bean);
                    //第一个个参数是调用该方法的对象,如果方法有参数,放在后面
                    method.invoke(bean,value);
                } catch (InvocationTargetException | IllegalAccessException exception) {
                    //获取内部异常
                    Throwable cause = exception.getCause();
                    if(cause instanceof MyException){
                        //如果为自定义异常可以进行处理
                    }else{
                        exception.printStackTrace();
                    }
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }
    }
}

posted @ 2022-10-31 11:05  鱼鱼寡欢  阅读(463)  评论(0编辑  收藏  举报