您可以使用类路径扫描来做到这一点:基本上,您检查类路径中每个类的每个方法,并使用给定的注释进行所有注释。之后,您调用找到的方法。
下面是一种runAllAnnotatedWith()
可以做到的方法。它使用反射来完成类路径扫描的繁琐工作。为简单起见,它执行所有找到的方法,就好像它们static
不需要参数一样。
public static void runAllAnnotatedWith(Class<? extends Annotation> annotation)
throws Exception {
Reflections reflections = new Reflections(new ConfigurationBuilder()
.setUrls(ClasspathHelper.forJavaClassPath())
.setScanners(new MethodAnnotationsScanner()));
Set<Method> methods = reflections.getMethodsAnnotatedWith(annotation);
for (Method m : methods) {
// for simplicity, invokes methods as static without parameters
m.invoke(null);
}
}
您可以使用以下方式运行它:
runAllAnnotatedWith(mod.class);
注意:可以不使用Reflections来实现,但是代码会越来越脏。
这是完整的代码(将其全部粘贴到 RunClass.java 文件中):
import java.lang.annotation.Annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Method;
import java.util.Set;
import org.reflections.Reflections;
import org.reflections.scanners.MethodAnnotationsScanner;
import org.reflections.util.ClasspathHelper;
import org.reflections.util.ConfigurationBuilder;
public class RunClass {
public static void main(String args[]) throws Exception {
runAllAnnotatedWith(mod.class);
}
public static void runAllAnnotatedWith(Class<? extends Annotation> annotation) throws Exception {
Reflections reflections = new Reflections(new ConfigurationBuilder()
.setUrls(ClasspathHelper.forJavaClassPath()).setScanners(
new MethodAnnotationsScanner()));
Set<Method> methods = reflections.getMethodsAnnotatedWith(annotation);
for (Method m : methods) {
m.invoke(null); // for simplicity, invoking static methods without parameters
}
}
@mod(name = "me1")
public static void calledcs() {
System.out.println("called");
}
@mod(name = "me2")
public static void calledcs2() {
System.out.println("called2");
}
}
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@interface mod {
String name() default "";
}
要运行它,您必须将Reflections JAR 添加到您的项目中。在这里下载。
如果您使用 Maven,您可以使用以下命令添加它:
<dependency>
<groupId>org.reflections</groupId>
<artifactId>reflections</artifactId>
<version>0.9.9-RC1</version>
</dependency>