当前位置: 首页 > 面试题库 >

如何在给定的包中找到带注释的方法?

范豪
2023-03-14
问题内容

我为方法提供了一个简单的标记注释(类似于 有效Java (第2版)第35条中的第一个示例):

/**
 * Marker annotation for methods that are called from installer's 
 * validation scripts etc. 
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface InstallerMethod {
}

然后,在给定的包(例如com.acme.installer)中,它有一些包含20个类的子包,我想找到所有带有注释的方法。(因为我想对单元测试中所有带注释的方法进行一些检查。)

最简单的方法是什么?最好不要添加新的第三方库或框架。

编辑
:进行澄清,显然method.isAnnotationPresent(InstallerMethod.class)将是检查方法是否具有注释的方法-
但此问题包括查找所有方法。


问题答案:

如果要自己实现,则这些方法将在给定包中找到所有类:

/**
 * 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<Class> getClasses(String packageName) throws ClassNotFoundException, IOException
{
    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    String path = packageName.replace('.', '/');
    Enumeration<URL> resources = classLoader.getResources(path);
    List<File> dirs = new ArrayList<File>();
    while (resources.hasMoreElements())
    {
        URL resource = resources.nextElement();
        URI uri = new URI(resource.toString());
        dirs.add(new File(uri.getPath()));
    }
    List<Class> classes = new ArrayList<Class>();
    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<Class> findClasses(File directory, String packageName) throws ClassNotFoundException
{
    List<Class> classes = new ArrayList<Class>();
    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;
}

然后,您可以使用给定的注释对这些类进行过滤:

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


 类似资料:
  • 我有这个spring配置: 如何获取用Foo注释的所有bean的列表? 注意:

  • 问题内容: 给定一个类名作为字符串,如何在运行时获取它的包名?我没有带有包名+类名的完全限定名称。仅是类名。 我想在方法中使用包名。 找到第一个匹配的软件包名称(如果多个软件包具有相同的类),就可以了。 有任何想法吗? 更新 我没有要处理的Class实例。我的要求是使用该方法创建一个Class 。但是我只是将类名作为字符串。我需要某种方法来遍历软件包并确定我所拥有的类是否属于该软件包。 异常的堆栈

  • 假设我有一个博客数据集,看起来像 在这里,每个文档代表一篇博客文章。每个博客帖子可以有多个评论,但只有一个我的一个用户。比如说,我必须找到某位作者的所有评论。对此有何疑问? 一种方法是释放评论,然后按comments.author分组,并推送comments.body。 然而,它可以做到没有聚合管道,只是通过使用查找?因为我认为我应该通过寻找来做到这一点。有人能帮我吗?

  • 问题内容: 我需要 在类中使用@X注释的方法或使用@X注释的方法的切入点 。我还 需要注释对象 。如果同时注释了类和方法,则 我更喜欢将方法注释作为参数 。 我尝试了以下操作,这将创建“不一致的绑定”警告。(为什么不将它们设置为null?) 下面创建“跨’||’的参数x的模糊绑定 在切入点”警告。(我认为这并不一定有意义:为什么不绑定第一个短路评估?) 如果存在类和方法注释,则将先前的尝试自然地分

  • 问题内容: 据我所知,要使用@Annotations(或C#中的[Attributes]),必须具有对类元数据的引用,以便您可以询问是否对类进行了注释(归因)。 我的问题是,JSF实现如何找到使用@ManagedBean注释的所有类?它会扫描类路径中的所有类吗?还是有一种方法实际上可以“查询” JVM中的带注释的类? 我之所以这样问是因为,当我将带注释的后备bean直接放在Web项目中时,没有问题

  • 当我有一个没有javadoc的公共方法时,Checkstyle会发出警告,这很好!当我重写一个公共方法时,我没有得到警告,因为javadoc已经在该方法的父类中可用。 现在,我的方法有了另一个注释,例如MyEvent。现在我确实收到了警告,但我不想要它,因为注释已经足够了。是否可以排除具有特定注释的方法的警告? 有一些解决方案涉及向我的代码中添加诸如或之类的注释,但这并不能使我的代码更好,我可以改