像@depreciated这样的注释

时间:2015-12-16 10:04:00

标签: java annotations

我希望为方法实现一个注释,让我知道那些带注释的方法在哪里调用,就像官方的@deprecated注释一样。

如何获取给定注释方法的所有调用方法的列表?

1 个答案:

答案 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;
  }
}