<dependency> <groupId>org.reflections</groupId> <artifactId>reflections</artifactId> <version>0.9.10</version> </dependency>
reflections 中包含不少的Scanner ,也就是掃描器,調用對應的方法時須要有配置對應的掃描器,否則程序會拋出異常.java
//掃描包含my.package的url,包括'my.package'開頭的包路徑,使用默認掃描器 Reflections reflections = new Reflections("my.package");
public class testReflections { private static final Reflections reflections; static { //若是不加filterInputsBy,那麼會掃描classpath,獲取當前掃描路徑所在項目的全部包 reflections= new Reflections(new ConfigurationBuilder() .forPackages("com.study.demo")//指定掃描路徑 .filterInputsBy(new FilterBuilder().excludePackage("mystu")) //排除某個包,注意不能是掃描包子包,不然不生效 .setScanners(new MethodParameterScanner())// 添加方法參數掃描工具,能夠根據須要向該方法傳入多個掃描工具 ); } public static void main(String[] args) { // 一、根據方法參數,反射獲取掃描路徑下全部匹配的方法 Set<Method> methodsMatchParams = reflections.getMethodsMatchParams(String.class); methodsMatchParams.forEach(System.out::println); } }
//SubTypesScanner:子類掃描器 Set<Class<? extends User>> set = reflections.getSubTypesOf(User.class); // 獲取void返回值方法 Set<Method> voidMethods = reflections.getMethodsReturn(void.class); // FieldAnnotationsScanner:被註解字段掃描器,獲取特定註解的字段 Set<Field> fields = reflections.getFieldsAnnotatedWith(NotNull.class);
根據方法的可見性,前綴名,入參個數,獲取某個類的對應方法
Set<Method> getters = ReflectionUtils.getAllMethods(User.class, withModifier(Modifier.PUBLIC), withPrefix("set"), withParametersCount(1));
根據方法入參返回值類獲某個類的全部方法
//獲取List的方法:入參爲Collection,返回值爲boolean Set<Method> methods = ReflectionUtils.getAllMethods(List.class, withParametersAssignableTo(Collection.class), withReturnType(boolean.class));
獲取某個類特定類型的全部字段
//該方法能夠傳入一些參數,好比過濾出帶註解的參數:withAnnotation(NonNull.class) Set<Field> fields = ReflectionUtils.getAllFields(Animal.class, withTypeAssignableTo(String.class));