Самоанализ пакета Java [дубликат]

Почему бы не использовать вкладки (представленный в Vim 7)? Можно переключиться между вкладками с :tabn и :tabp, С :tabe <filepath> можно добавить новую вкладку; и с постоянным клиентом :q или :wq Вы закрываете вкладку. Если Вы карта :tabn и :tabp к Вашему F7 / ключи F8 можно легко переключиться между файлами.

, Если нет то, что у многих файлов или Вас нет Vim 7, можно также разделить экран в нескольких файлах: :sp <filepath>. Тогда можно переключиться между splitscreens с Ctrl + W и затем клавишей со стрелкой в направлении, которое Вы хотите переместить (или вместо клавиш со стрелками, w для следующего и W для предыдущего splitscreen)

5
задан 20 July 2009 в 23:38
поделиться

6 ответов

Вы не можете. Классы могут поступать через множество различных загрузчиков классов, включая удаленные.

10
ответ дан 18 December 2019 в 06:51
поделиться

Вот более полный способ решения этой проблемы для банок, основанный на идее, опубликованной JG.

/**
 * Scans all classloaders for the current thread for loaded jars, and then scans
 * each jar for the package name in question, listing all classes directly under
 * the package name in question. Assumes directory structure in jar file and class
 * package naming follow java conventions (i.e. com.example.test.MyTest would be in
 * /com/example/test/MyTest.class)
 */
public Collection<Class> getClassesForPackage(String packageName) throws Exception {
  String packagePath = packageName.replace(".", "/");
  ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
  Set<URL> jarUrls = new HashSet<URL>();

  while (classLoader != null) {
    if (classLoader instanceof URLClassLoader)
      for (URL url : ((URLClassLoader) classLoader).getURLs())
        if (url.getFile().endsWith(".jar")  // may want better way to detect jar files
          jarUrls.add(url);

    classLoader = classLoader.getParent();
  }

  Set<Class> classes = new HashSet<Class>();

  for (URL url : jarUrls) {
    JarInputStream stream = new JarInputStream(url.openStream()); // may want better way to open url connections
    JarEntry entry = stream.getNextJarEntry();

    while (entry != null) {
      String name = entry.getName();
      int i = name.lastIndexOf("/");

      if (i > 0 && name.endsWith(".class") && name.substring(0, i).equals(packagePath)) 
        classes.add(Class.forName(name.substring(0, name.length() - 6).replace("/", ".")));

      entry = stream.getNextJarEntry();
    }

    stream.close();
  }

  return classes;
}
7
ответ дан 18 December 2019 в 06:51
поделиться

Глобального способа сделать это не существует. При этом, если вы знаете, откуда берутся ваши классы, вы можете просмотреть каталог файла jar или файловую систему.

1
ответ дан 18 December 2019 в 06:51
поделиться

В Java нет функции обнаружения.

Большинство продуктов, которые имеют возможность добавлять (обнаруживать) новые классы, имеют либо текстовый файл, описывающий «Расширения программы», либо конкретный каталог, в который вы можете поместить классы или jar-файлы, использующие описанный трюк вроде @JG. (Это то, что делает eclipse, и рекомендуется для любого решения, в котором пользователь может добавить новый модуль вручную)

1
ответ дан 18 December 2019 в 06:51
поделиться

В ответах выше описаны необходимые функции. Однако более подробную информацию по этому вопросу можно найти здесь и здесь .

1
ответ дан 18 December 2019 в 06:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: