我希望为方法实现一个注释,让我知道那些带注释的方法在哪里调用,就像官方的@deprecated注释一样。
如何获取给定注释方法的所有调用方法的列表?
答案 0 :(得分:0)
我认为this question可能会对您有所帮助:
要找到这个带注释的方法(来自Arthur Ronald's answer):
使用 org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider
API
从基础包扫描类路径的组件提供程序。然后,它会对结果类应用exclude和include过滤器 寻找候选人。
ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(<DO_YOU_WANT_TO_USE_DEFALT_FILTER>); scanner.addIncludeFilter(new AnnotationTypeFilter(<TYPE_YOUR_ANNOTATION_HERE>.class)); for (BeanDefinition bd : scanner.findCandidateComponents(<TYPE_YOUR_BASE_PACKAGE_HERE>)) System.out.println(bd.getBeanClassName());
或(来自Jonathan's answer):
谷歌的反思:
https://github.com/ronmamo/reflections
快速审核:
- 如果您使用Spring,Spring解决方案就是您的选择。否则,这是一个很大的依赖。
- 直接使用ASM有点麻烦。
- 直接使用Java Assist也很笨拙。
- Annovention超轻便,方便。还没有maven整合。
- 谷歌的反思引入了Google收藏。索引一切然后超快。
更新:如果想要为给定的带注释方法调用方法,则应使用AOP(面向方面编程)并添加@ Around或@ Before,例如类似这样的内容(我不会&#39 ;检查此代码):
public class Foo {
@YourAnnotation
public int power(int x, int p) {
return Math.pow(x, p);
}
}
@Aspect
public class MethodLogger {
@Around("execution(* *(..)) && @annotation(YourAnnotation)")
public Object around(ProceedingJoinPoint point) {
Logger.info(
"call by method" + MethodSignature.class.cast(point.getSignature()).getMethod().getName()
);
Object result = point.proceed();
return result;
}
}