Как получить список пакетов и / или классов на пути к классам? - PullRequest
2 голосов
/ 21 августа 2009

В Java я могу использовать ClassLoader для получения списка уже загруженных классов и пакетов этих классов. Но как мне получить список классов, которые могут быть загружены, то есть находятся в пути к классам? То же самое с пакетами.

Это для компилятора; при синтаксическом анализе foo.bar.Baz я хочу знать, является ли foo пакетом, чтобы отличить его от всего остального.

Ответы [ 3 ]

3 голосов
/ 21 августа 2009

Я думаю, что org.reflections должна делать то, что вы хотите. Он сканирует путь к классам и позволяет вам, например, получить все классы или только те, которые расширяют определенный супертип. Оттуда должна быть возможность получить все доступные пакеты.

3 голосов
/ 21 августа 2009

Немного сложно, и есть несколько библиотек, которые могут помочь, но в основном ...

  1. Посмотрите на ваш путь к классу
  2. Если вы имеете дело с каталогом, вы можете искать все файлы, заканчивающиеся на .class
  3. Если вы имеете дело с банкой, загрузите банку и найдите все файлы, заканчивающиеся на .class
  4. Удалите .class из конца файла, замените "\" на "." и тогда у вас есть полное имя класса.

Если у вас в классе есть весна, вы можете воспользоваться тем, что они уже делают большую часть этого:

ArrayList<String> retval = new ArrayList<Class<?>>();
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
MetadataReaderFactory readerFactory = new CachingMetadataReaderFactory(resolver);
String basePath = ClassUtils.convertClassNameToResourcePath("com.mypackage.to.search");
Resource[] resources;
try {
    resources = resolver.getResources("classpath*:" + basePath + "/**/*.class");
} catch (IOException e) {
    throw new AssertionError(e);
}
for (Resource resource : resources) {
    MetadataReader reader;
    try {
        reader = readerFactory.getMetadataReader(resource);
    } catch (IOException e) {
        throw new AssertionError(e);
    }
String className = reader.getClassMetadata().getClassName();
retval.add(className)   
}
return retval;
2 голосов
/ 21 августа 2009

Я сам искал этот ответ, но это невозможно.

Единственный известный мне способ заключается в том, что у вас есть все классы, которые можно загрузить в определенную директорию, и затем искать в ней имена файлов, заканчивающиеся на .class.

После этого вы можете сделать Class.forName(name_of_class_file).createInstance() для этих имен файлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...