Reflections 快速入门 引入 pom
1 2 3 4 5 <dependency > <groupId > org.reflections</groupId > <artifactId > reflections</artifactId > <version > 0.9.11</version > </dependency >
典型应用
1 2 3 Reflections reflections = new Reflections ("my.project" );Set<Class<? extends SomeType >> subTypes = reflections.getSubTypesOf(SomeType.class); Set<Class<?>> annotated = reflections.getTypesAnnotatedWith(SomeAnnotation.class);
使用 基本上,使用 Reflections 首先使用 urls 和 scanners 对其进行实例化
1 2 3 4 5 6 7 8 9 10 Reflections reflections = new Reflections ("my.package" );new Reflections (new ConfigurationBuilder () .setUrls(ClasspathHelper.forPackage("my.project.prefix" )) .setScanners(new SubTypesScanner (), new TypeAnnotationsScanner ().filterResultsBy(optionalFilter), ...), .filterInputsBy(new FilterBuilder ().includePackage("my.project.prefix" )) ...);
然后,使用方便的查询方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 Set<Class<? extends Module >> modules = reflections.getSubTypesOf(com.google.inject.Module.class); Set<Class<?>> singletons = reflections.getTypesAnnotatedWith(javax.inject.Singleton.class); Set<String> properties = reflections.getResources(Pattern.compile(".*\\.properties" )); Set<Method> resources = reflections.getMethodsAnnotatedWith(javax.ws.rs.Path.class); Set<Constructor> injectables = reflections.getConstructorsAnnotatedWith(javax.inject.Inject.class); Set<Field> ids = reflections.getFieldsAnnotatedWith(javax.persistence.Id.class); Set<Method> someMethods = reflections.getMethodsMatchParams(long .class, int .class); Set<Method> voidMethods = reflections.getMethodsReturn(void .class); Set<Method> pathParamMethods = reflections.getMethodsWithAnyParamAnnotated(PathParam.class); List<String> parameterNames = reflections.getMethodParamNames(Method.class) Set<Member> usages = reflections.getMethodUsages(Method.class)
说明:
如果未配置扫描程序,则将使用默认值 - SubTypesScanner 和 TypeAnnotationsScanner。
还可以配置类加载器,它将用于从名称中解析运行时类。
Reflection 默认情况下会扩展超类型。 这解决了传输 URL 不被扫描的一些问题。
ReflectionUtils 1 2 3 4 5 6 7 8 9 10 11 import static org.reflections.ReflectionUtils.*;Set<Method> getters = getAllMethods(someClass, withModifier(Modifier.PUBLIC), withPrefix("get" ), withParametersCount(0 )); Set<Method> listMethodsFromCollectionToBoolean = getAllMethods(List.class, withParametersAssignableTo(Collection.class), withReturnType(boolean .class)); Set<Field> fields = getAllFields(SomeClass.class, withAnnotation(annotation), withTypeAssignableTo(type));