自定义注解扫描获取类信息

自定义注解扫描获取类信息

一、创建自定义的注解

@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);
    }

}

里面定义两个方法,并有不同的参数。

三、创建工具类扫描具有自定义注解的类

  1. 使用类名.class.getResource("").getPath()方法获得物理路径

注意:类中获取类型类使用class属性。实例对象使用getClass方法获得类型类。getResource中的参数有一下几种:

关于java的getResource方法

  1. 创建一个方法,获得需要扫描包下类的全限定名
  2. 使用反射获取这些类的类型类,并判断是否有自定义的注解

代码实现:

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)){
    
    
                // 对这些类的信息进行封装,可以定义使用另一个工具类
                // 此处省略
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43967401/article/details/108441553
今日推荐