自定义注解并获取所有带有该注解的方法

自定义注解并获取所有带有该注解的方法

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Handler {
    String request();
}
  • 注解定义
public class ClassUtils {
    public static String RootPath = new File("").getAbsolutePath();
    public static String classPath = Thread.currentThread().getContextClassLoader().getResource("").getPath();

    private static List<Class> getAllClasses(File file, List<Class> classes) throws ClassNotFoundException {
        if (file.isDirectory()) {
            File[] files = file.listFiles();
            for (File f : files) getAllClasses(f, classes);
        } else {
            if (file.getName().endsWith(".class")) {
                String className = file.getPath().replace(".class","").replace(classPath.replace("/","\\").substring(1),"").replace("\\",".");
                classes.add(Class.forName(className));
            }
        }
        return classes;
    }

    public static List<Class> getAllClasses() throws ClassNotFoundException {
        List<Class> list = new ArrayList<>();
        list = getAllClasses(new File(classPath), list);
        return list;
    }

    public static List<Class> getAllClasses(String path) throws ClassNotFoundException {
        List<Class> list = new ArrayList<>();
        list = getAllClasses(new File(path), list);
        return list;
    }
}
  • RootPath项目根路径
  • classPathclass路径
  • getAllClasses获取指定目录(或根目录)下所有的.class
public class AnnotationUtils {
    public static Map<String, Method> getAllHandler() throws ClassNotFoundException {
        Map<String, Method> map = new ConcurrentHashMap<>();
        List<Class> list = ClassUtils.getAllClasses();
        list.forEach(aClass -> {
            List<Method> methodList = List.of(aClass.getMethods());
            methodList.forEach(aMethod ->{
                if (aMethod.getAnnotation(Handler.class) != null){
                    map.put(aMethod.getAnnotation(Handler.class).request().toString(), aMethod);
                }
            });
        });
        return map;
    }
}
  • getAllHandler 获取 所有@Handler方法

https://github.com/jt-jiangtao/lsp-server
github:lsp-server 基于netty的lsp服务器, 你可以用该框架编写vscode等编译器插件(插件后端)

水一篇文章

这两个工具类是lsp-server实现@Handler处理前端请求的核心

目前lsp-server项目仅仅完成核心部分,包括rpc 使用@Handler处理前端传来的请求

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值