SpringBoot扫描注册注解

有个小需求是扫描在SpringBoot 注册的RequestMapping接口地址,可以先扫描所有使用Controller注解的类,然后获取他们的方法,判断使用的RequestMapping注解,再获取value,就能拿到接口地址了。下面为代码片段

    /**
     * 扫描使用注解的类
     * @param packageName 扫描包名
     * @param annotation 注解类
     * @return 扫描到的集合
     */
    public static List<class> scanClass(String packageName, Class annotation) {
        List<class> classList = new ArrayList&lt;>();
        if (ObjectUtils.isEmpty(packageName)) {
            return classList;
        }
        ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false);
        TypeFilter includeFilter = (metadataReader, metadataReaderFactory) -> true;
        provider.addIncludeFilter(includeFilter);
        Set<beandefinition> beanDefinitionSet = new HashSet&lt;>();
        // 指定扫描的包名
        Set<beandefinition> candidateComponents = provider.findCandidateComponents(packageName);
        beanDefinitionSet.addAll(candidateComponents);

        beanDefinitionSet.forEach(beanDefinition -> {
            try {
                Class clazz = Class.forName(beanDefinition.getBeanClassName());

                if (!ObjectUtils.isEmpty(annotation)) {
                    if (!ObjectUtils.isEmpty(AnnotationUtils.getAnnotation(clazz, annotation))) {
                        classList.add(clazz);
                    }
                } else {
                    classList.add(clazz);
                }
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
//            System.out.println(definition.getBeanClassName());
        });
        return classList;
    }

    /**
     * 获取Url
     * @param packageName 扫描包名
     * @param className 指定类,如无指定类,为null即可
     * @return url集合
     */
    public static List<string> getUrls(String packageName,String className){
        List<class> list= scanClass(packageName, Controller.class);
        List<string> urls=new ArrayList&lt;>();
        for (Class aClass : list) {
            if(className!=null&amp;&amp;!aClass.getSimpleName().equals(className)){
                continue;
            }
            Method[] methods= aClass.getDeclaredMethods();
            for (Method method : methods) {
                RequestMapping ls=method.getAnnotation(RequestMapping.class);
                if(ls!=null) {
                    urls.add(ls.value()[0]);
                }
            }
        }
        return urls;
    }

在Android上加载jar包中的Activity以及Service

前言:

截止到目前版本,本项目仅支持已经在manifest中提前注册好Service!

Activity已可以无清单启动了,但没有处理资源文件

项目地址:https://gitee.com/yutousama/ProxyActivity

先附上几个用得上的Android 源码地址吧

BaseDexClassLoader

DexPathList

继续阅读在Android上加载jar包中的Activity以及Service

Activity与Service跨进程通讯、数据库访问

1.通过广播来操作写数据库

在一个项目中,Activity和子进程的Service想要访问同一个数据库,可能会造成多线程访问数据异常,目前我的解决方案是Service发送广播,然后BroadcastReceiver接收到广播后再写入数据库,如果需要读的话,可能还是需要走aidl进行数据读写。

继续阅读Activity与Service跨进程通讯、数据库访问