获取包中具有特定注释的所有方法



我知道我们可以在类中获取具有特定注释的所有方法。但是我希望所有方法都包含在带有该注释的包中。 我的用例:我想注释和识别几组方法,并要求我的用户选择其中一个添加到要执行的流中。

@Retention(RetentionPolicy.RUNTIME)
@Target({ METHOD })
public @interface Step {
    String Type();// default "Trigger";
    String SubType();
    String [] tags();
}
public interface APITrigger {
    @Step(Type = "TRIGGER", SubType = "GET_CLASS_INSTANCE", tags = { "trigger", "build instance", "class object" })
    public Object getClassInstance(@NonNull final String packageNclassName)
            throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, NoSuchFieldException;
    @Step(Type = "TRIGGER", SubType = "INVOKE_API_N_RETURN", tags = { "trigger", "hit api", "trigger api and return" })
    public Map<Class<?>, Object> invokeOveloadedAPINReturn(@NonNull final Object classInstance,
            @NonNull final String methodName);
}
public interface Comparator {
    @Step(Type = "COMPARATOR", SubType = "GENERIC_COMPARATOR", tags = { "compare", "expected", "observed", "any type", "generic comparator" })
    public <T> ComparisonResult Compare(T Expected, T Observed);
}

我想要方法列表[getclassinstance,invokeOveloadedAPINReturn,Compare],因为这三个方法都用Step注释。我们可以通过反思来做到这一点吗?另外,我们是否可以在注释中使用变量来限制搜索?

最好的方法是使用反射(这是这个库的名称(,它允许对类路径进行非常简单的扫描,以查找具有给定注释的类或方法。

Set<Method> methodsAnnotatedWith = new Reflections("my.package", new MethodAnnotationsScanner()).getMethodsAnnotatedWith(SomeAnnotation.class);

如果你出于某种原因想编写自己的一个,那么你需要从给定的类加载器获取类路径和URL,以手动扫描给定位置的类文件以加载它们并检查它们是否给出了注释/方法。这个库也可以在不加载你不需要的类的情况下做到这一点,因为扫描本身不会加载类,只会加载与你的"查询"匹配的类。(它通过加载.class文件来拥有自己的数据结构来做到这一点(

最新更新