在我自己的项目中,我自定义一个注解
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface ExcelSheet {
/**
* 表格类别
* @return
*/
String value();
/**
* 创建的顺序(越大越往后执行)
* @return
*/
int index();
}
用来标注一些方法
例如:
@ExcelSheet(value = "excel", index = 1)
public void firstCallImpl() {
//一些执行的代码
}
我现在的需求:
如果有多个方法被这个注解标注了那么,我能通过这个注解获取这个方法吗?
感谢大佬们的回答
第一步,你要知道都有哪些class中加了注解,如果不知道,就要根据包名遍历工程下所有的class了
第二步,获取class中所有的method,通过method中的 method.getAnnotation(ExcelSheet.class) 方法获取注解,如果能获取到,说明该字段上标了该注解,如果获取不到就表示没标。
PS:遍历工程下所有的class是非常耗时的操作,建议系统启动的时候遍历一遍,然后缓存起来,以后再获取ExcelSheet注解的方法是,直接从缓存中取即可
以aop around 为列,可以这样写,仅供参考
@Around("within(com.fly..* )")
public Object around(ProceedingJoinPoint joinPoint)
throws Throwable
{
String className = joinPoint.getTarget().getClass().getSimpleName();
MethodSignature signature = (MethodSignature)joinPoint.getSignature();
Method method = signature.getMethod();
String methodName = new StringBuilder(className).append(".").append(method.getName()).toString();
boolean isExcelSheet = method.isAnnotationPresent(ExcelSheet.class);
。。。
}
知道你的需求了,换一种思路,使用你这个自定义注解的类是spring管理的,根据上下文获取bean的代码为:
LOGGER.info("★★★★★★★★ ApplicationContext = {}", applicationContext);
int i = 1;
for (String beanName : applicationContext.getBeanDefinitionNames())
{
LOGGER.info("{}.\t{}", i, applicationContext.getBean(beanName));
i++;
}
下面用反射的方式去判断应该不难了吧,可以自己调试,供参考。
补充下这个问题的需求:
上边这个问题的需求的原因:
我现在需要做一个excel ,一个excel里会有多个sheet ,我这个就是给注解的value相同的就会组成一个excel,而且根据index 的先后调用,到时候我就不用手动调用生成每个sheet。我只需要关注每个sheet是怎么生成的,达到解耦的目的