后面发现了一个比较好用的反射框架: Reflections。使用Reflections可以很轻松的获取以下数据:
大家可以去github上看看,它里面列举了很多常用的例子。我这里也是搬过来简单说下,当做自己的一个笔记。
首先要导入它的依赖。
org.reflections
reflections
0.10.2
先定义一个接口和两个抽象类:
package com.qiuguan.demo.service;
public interface UserService {
void login();
}
public class UserServiceImpl implements UserService {
@MyAnnotation
@Override
public void login() {
}
}
public class UserServiceExtImpl implements UserService {
@MyAnnotation
@Override
public void login() {
}
}
自定义一个注解:
package com.qiuguan.demo.anns;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
public @interface MyAnnotation {
}
自定义两个类:
package com.qiuguan.demo.bean;
public abstract class AbstractAnimal {
}
@MyAnnotation
public class Cat extends AbstractAnimal {
private String name;
@MyAnnotation
public void eat() {
}
}
进入正题:
import static org.reflections.scanners.Scanners.TypesAnnotated;
public class ReflectionTest {
public static void main(String[] args) {
//这里如果不指定扫描的包路径,那么它会根据类加载器把项目中的类路径以及jar包都会扫描,会比较慢,所以最好指定路径
Reflections reflections = new Reflections("com.qiuguan.demo");
//标注了该注解的所有类
Set> classes = reflections.get(TypesAnnotated.of(MyAnnotation.class).asClass());
classes.forEach(System.out::println);
}
}
输出结果:
class com.qiuguan.demo.bean.Cat
import static org.reflections.scanners.Scanners.*;
public class ReflectionTest {
public static void main(String[] args) {
/**
* 这里如果不指定扫描的包路径,那么它会根据类加载器把项目中的类路径以及jar包都会扫描,会比较慢,所以最好指定路径
* 参考 {@link Scanners } 类,配置不同的Scanner, 比如扫描类注解,方法注解,子类等等。
*/
Reflections reflections = new Reflections(new ConfigurationBuilder()
.forPackage("com.qiuguan.demo")
//这里要和上面保持一致保持一致,不写也不行,不然输出结果不对。没有特殊要求,就用String参数的构造器
.filterInputsBy(new FilterBuilder().includePackage("com.qiuguan.demo"))
//包含包和排除包路径。写excludePackage前要先写includePackage,不然排除包不会生效
//.filterInputsBy(new FilterBuilder().includePackage("com.qiuguan.demo").excludePackage("com.qiuguan.boot"))
.setScanners(TypesAnnotated, Scanners.MethodsAnnotated, SubTypes, MethodsReturn)
);
System.out.println("=================== 获取标注该注解的所有类 =======================");
Set> typesAnnotatedWith = reflections.get(TypesAnnotated.of(MyAnnotation.class).asClass());
typesAnnotatedWith.forEach(System.out::println);
System.out.println("=================== 获取标注该注解的所有方法 =======================");
Set> returnsAnnotatedWith = reflections.get(MethodsReturn.of(void.class).asClass());
returnsAnnotatedWith.forEach(System.out::println);
}
}
00:14:16.193 [main] INFO org.reflections.Reflections - Reflections took 185 ms to scan 1 urls, producing 10 keys and 19 values
=================== 获取标注该注解的所有类 =======================
class com.qiuguan.demo.bean.Cat
=================== 获取标注该注解的所有方法 =======================
=================== 获取返回值是void的方法 =======================
import static org.reflections.ReflectionUtils.*;
//获取某个类的所有父类
Set
如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!
添加我为好友,拉您入交流群!
请使用微信扫一扫!