注解+包扫描

public void packageScan(String packaeName) throws Exception {
        String path = packaeName.replace('.', '/');
        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
        Enumeration<URL> urls = classLoader.getResources(path);
        while (urls.hasMoreElements()) {
            URL url = urls.nextElement();
            if (url.getProtocol().equals("file")) {
                File file = new File(url.toURI());
                scanFile(file, packaeName);
            } else if (url.getProtocol().equals("jar")) {
                scanJar(url);
            }
        }
    }

包扫描分对文件包和jar包两种扫描方式,首先由用户输入的包名获取URL,根据url.getProtocol()判断包协议。

文件包:

private void scanFile(File dir, String packageName) throws ClassNotFoundException {
        File[] files = dir.listFiles();
        for (File file : files) {
            if (file.isDirectory()) {
                scanFile(file, packageName + "." + file.getName());
            } else if (file.isFile() && file.getName().endsWith(".class")) {
                String className = packageName + "." + file.getName().replace(".class", "");
                Class<?> klass = Class.forName(className);
                dealClass(klass);
            }
        }
    }

文件直接生成File,因为包名.文件名(去.class)为当前类路径,可通过反射获取该类。
文件包只需要该文件及包名称用于生成类。

jar包:

private void scanJar(URL url) throws IOException, ClassNotFoundException {
        JarURLConnection connection = (JarURLConnection) url.openConnection();
        JarFile jarFile = connection.getJarFile();
        Enumeration<JarEntry> entries = jarFile.entries();
        while (entries.hasMoreElements()) {
            JarEntry entry = entries.nextElement();
            if (entry.isDirectory() || !entry.getName().endsWith(".class")) {
                continue;
            }
            String className = entry.getName().replace(".class", "");
            className = className.replace('/', '.');
            Class<?> klass = Class.forName(className);
            dealClass(klass);
        }
    }

jar包需要url获取连接、jarFile、entry(类比于File),连接就是获取进入包的权限,jarFile实际就是jar包,entries就是jar包下所有文件的包路径(包括类、包),再由包路径构造出类路径 反射即可。

当包扫描结合注释,包扫描用于扫描包下全部的类,而注解用于标注所需的类、方法、参数等,整个过程就是在包内筛选出被注解修饰过的东西。
因此通过该方法可替代xml、properties配置,原理都是在现成代码内查询所需要的东西。
xml配置相比于注解要更加繁琐、代码量更大,但是注解需要对源代码进行更改,固使用时还须结合当前情况进行判断。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魔幻音

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值