我知道我们可以在类中获取带有特定注释的所有方法。但是我想要带有注释的包中的所有方法。 我的用例:我想注释和识别几套方法,并要求我的用户选择其中的一种,然后添加要执行的流程。
@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注释。我们可以反思吗?另外,我们是否也可以使用注解内的变量来限制搜索?
答案 0 :(得分:2)
最好的方法是使用Reflections(这是该库的名称),它允许对类路径进行非常简单的扫描,以查找具有给定批注的类或方法。
Set<Method> methodsAnnotatedWith = new Reflections("my.package", new MethodAnnotationsScanner()).getMethodsAnnotatedWith(SomeAnnotation.class);
如果出于某种原因要编写自己的文件,则需要从给定的类加载器获取类路径和url,以手动扫描给定位置的类文件以加载它们,并检查它们是否具有注释/方法。该库还实现了以下功能:无需加载不需要的类,因为扫描本身未加载类,因此仅加载与“查询”匹配的类。 (并且通过将.class文件加载到自己的数据结构中来做到这一点)