How to find annotated methods in a given package?

前端 未结 3 1048
再見小時候
再見小時候 2020-11-28 23:25

I have a simple marker annotation for methods (similar to the first example in Item 35 in Effective Java (2nd ed)):

/**
 * Marker annotation for met         


        
3条回答
  •  予麋鹿
    予麋鹿 (楼主)
    2020-11-29 00:06

    If you want to implement it yourself, these methods will find all the classes in a given package:

    /**
     * Scans all classes accessible from the context class loader which belong
     * to the given package and subpackages.
     * 
     * @param packageName
     *            The base package
     * @return The classes
     * @throws ClassNotFoundException
     * @throws IOException
     */
    private Iterable getClasses(String packageName) throws ClassNotFoundException, IOException
    {
        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
        String path = packageName.replace('.', '/');
        Enumeration resources = classLoader.getResources(path);
        List dirs = new ArrayList();
        while (resources.hasMoreElements())
        {
            URL resource = resources.nextElement();
            URI uri = new URI(resource.toString());
            dirs.add(new File(uri.getPath()));
        }
        List classes = new ArrayList();
        for (File directory : dirs)
        {
            classes.addAll(findClasses(directory, packageName));
        }
    
        return classes;
    }
    
    /**
     * Recursive method used to find all classes in a given directory and
     * subdirs.
     * 
     * @param directory
     *            The base directory
     * @param packageName
     *            The package name for classes found inside the base directory
     * @return The classes
     * @throws ClassNotFoundException
     */
    private List findClasses(File directory, String packageName) throws ClassNotFoundException
    {
        List classes = new ArrayList();
        if (!directory.exists())
        {
            return classes;
        }
        File[] files = directory.listFiles();
        for (File file : files)
        {
            if (file.isDirectory())
            {
                classes.addAll(findClasses(file, packageName + "." + file.getName()));
            }
            else if (file.getName().endsWith(".class"))
            {
                classes.add(Class.forName(packageName + '.' + file.getName().substring(0, file.getName().length() - 6)));
            }
        }
        return classes;
    }
    

    Then you can just filter on those classes with the given annotation:

    for (Method method : testClass.getMethods())
    {
        if (method.isAnnotationPresent(InstallerMethod.class))
        {
            // do something
        }
    }
    

提交回复
热议问题