java - 检测java中带有某个注解的所有类

标签 java

我正在制作一个应用程序,该应用程序运行具有 @Window 注释的类内的所有方法,但现在我已经得到了:

    Class<App> obj = App.class;
    Object t = null;
    try {
        t = obj.newInstance();
    } catch (Exception e) {
        e.printStackTrace();
    }

    if (obj.isAnnotationPresent(Window.class)) {
        for (Method method : obj.getMethods()) {
            if (method.isAnnotationPresent(Window.Run.class)) {
                try {
                    method.invoke(t, new Object[] {});
                } catch (Exception e) {
                    System.err.println(e.getMessage());
                }
            }

        }

    }

但只有当我知道类名时它才有效。如何在没有外部 API 的情况下检测项目内的所有类?

最佳答案

所以,是的,这很困难,但我在没有任何 API 的情况下做到了

private static List<Class<?>> findClasses(File directory, String packageName) {
    List<Class<?>> classes = new ArrayList<Class<?>>();
    if (!directory.exists())
        return classes;

    File[] files = directory.listFiles();
    for (File file : files) {
        if (file.isDirectory()) {
            assert !file.getName().contains(".");
            classes.addAll(findClasses(file,
                    (!packageName.equals("") ? packageName + "." : packageName) + file.getName()));
        } else if (file.getName().endsWith(".class"))
            try {
                classes.add(Class
                        .forName(packageName + '.' + file.getName().substring(0, file.getName().length() - 6)));
            } catch (ClassNotFoundException e) {
                System.err.println(e.getMessage());
            }
    }
    return classes;
}

这将返回包内的所有类,如 CMD 中的 TREE 命令(如果插入“”作为包名称,这将返回项目内的所有类)。

public static Class<?>[] getClasses(String packageName) {

    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    assert classLoader != null;
    String path = packageName.replace('.', '/');
    Enumeration<URL> resources = null;
    try {
        resources = classLoader.getResources(path);
    } catch (IOException e) {
        System.err.println(e.getMessage());
    }
    List<File> dirs = new ArrayList<File>();
    while (resources.hasMoreElements()) {
        URL resource = resources.nextElement();
        dirs.add(new File(resource.getFile()));
    }
    List<Class<?>> classes = new ArrayList<Class<?>>();
    for (File directory : dirs)
        classes.addAll(findClasses(directory, packageName));

    return classes.toArray(new Class[classes.size()]);

}

然后此方法使用 findClasses() 方法从包中提取所有类。

关于java - 检测java中带有某个注解的所有类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51603125/

相关文章:

java - 如何将条形图放置在刻度线之间?

java - 如何在 Spring Boot 中手动验证用户身份?

java - 如何在 api-blueprint 中创建对象字段?

java - 对于 Galaxy S10,display.getSize(size) 返回错误的屏幕尺寸

Java Date "before"方法不存在

java - Camel kafka maxPollRecords配置是什么意思

java 将句子拆分为单词

java - opencsv CSV 阅读器 - 从特定行开始读取。

java - Web 驱动程序和 Web 驱动程序后端 Selenium 和 PhantomJs 之间的区别

java - 如何在支持的QPS的基础上对Kafka Consumer进行节流?