自定义注解扫描获取类信息
一、创建自定义的注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnno {
}
- 使用@Target元注解标识只能在类上使用
- 使用@Retention元注解标识能在运行期间存在
二、创建两个服务类
创建一个服务类,类上使用自定义的注解
@MyAnno
public class Service1 {
public void method1(String name){
System.out.println("这是方法一" + "name");
}
public void method2(String name, Integer age){
System.out.println("这是方法二" + name + age);
}
}
里面定义两个方法,并有不同的参数。
创建一个服务类,类上没有使用自定义的注解
public class Service2 {
public void method_one(String name){
System.out.println("这是没有注解的方法一" + name);
}
public void method_two(String name, Integer age){
System.out.println("这是没有注解的方法二" + name + age);
}
}
里面定义两个方法,并有不同的参数。
三、创建工具类扫描具有自定义注解的类
- 使用类名.class.getResource("").getPath()方法获得物理路径
注意:类中获取类型类使用class属性。实例对象使用getClass方法获得类型类。getResource中的参数有一下几种:
- 创建一个方法,获得需要扫描包下类的全限定名
- 使用反射获取这些类的类型类,并判断是否有自定义的注解
代码实现:
public class AnnoScanUntil {
public static void doScan(String packageName){
// 获取当前类的classpath
String classPath = AnnoScanUntil.class.getResource("/").getPath();
// 将报包名处理为路径的格式
String packagePath = packageName.replace(".","/");
// 得到欲扫描包的class文件的路径
classPath += packagePath;
// System.out.println(classPath);
// 定位到class文件的路径下
File classes = new File(classPath);
// 查看当前路径下的所有class文件
for (String s : classes.list()) {
// 获得这些类的全限定名
s = s.replace(".class","");
s = packageName +"."+ s;
Class<?> name = null;
try {
name = Class.forName(s);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
// 判断这些类是否有自定义的注解
if (name.isAnnotationPresent(MyAnno.class)){
// 对这些类的信息进行封装,可以定义使用另一个工具类
// 此处省略
}
}
}
}