Найти все пакеты в "моем" проекте - PullRequest
1 голос
/ 05 марта 2012

Я уже знаю, как получить все доступные пакеты, однако я пытаюсь получить только те пакеты, которые я сделал в своем собственном проекте Java.

Например, я не хочу, чтобы java.utilпоявляются в списке пакетов.

Я использую этот код для сбора классов:

List<String> result = new LinkedList<String>();

Package[] packages = Package.getPackages();

for(Package pack : packages)
{
    result.add(pack.getName());
}

И это работает очень хорошо, теперь я просто хочу избавиться от всехсистемные пакеты.

Есть ли способ отфильтровать пакеты, чтобы остались только те, которые я определил?

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

Я рассмотрел несколько связанных вопросов, но ни один из них не является тем, что я ищу.

Если есть способ определить, является ли имя пакета системным, это отлично сработает.

РЕДАКТИРОВАТЬ!

Я делаю это как часть API, и потомуиз этого я не могу просто сравнить имя пакета с установленным токеном, чтобы увидеть, если яЭто имя пакета, которое я использую, я не хочу, чтобы какое-либо редактирование требовалось, просто поместите файл класса в мой проект и используйте его, независимо от того, какие имена пакетов я выберу.

Один метод Iпопытался бы, как бы это ни казалось, работать и выдавал мне случайные ошибки, сканирует файл jar, чтобы проверить, есть ли эквивалентный каталог для имени пакета.Однако всякий раз, когда я сканирую файл JAR, я получаю сообщение об ошибке «Не удается получить доступ к файлу JAR, используется ли он другим процессом?».

Сканирование файла JAR определенно сработает, чтобы увидеть, существует ли класс в моем проекте(файл JAR), но другое ограничение заключается в том, что я должен скомпилировать его для тестирования, не могу просто протестировать его в Eclipse, я 10 раз редактировал код, пытаясь заставить поиск файла JAR работать, и каждый раз получал ошибки доступа, потому что javaw.exe использует файл jar, который не позволяет мне читать файлы внутри него.

Edit2!

Кто-то предложил мне составить список всех известных системных классов и сравнить его сэтот список, который сработал бы, если бы в разных JDK не было разных классов, поэтому меня интересует новый вопрос, есть ли способ получить все jar-файлы, которые являются частью текущей системной библиотеки JRE?Тогда я смогу прочитать их и добавить все их пакеты в фильтры.

Ответы [ 2 ]

2 голосов
/ 05 марта 2012
If there is a way to tell if a package name is a system package, 
that will do the job perfectly.

Нет, нет 100% уверенного способа определить, какие системные пакеты.Пакеты Java.и javax.зарезервированы и должны использоваться только как «системные» пакеты, но ничто не мешает вам нарушить это правило.Также различные JDK имеют свои собственные пакеты для реализации, например com.sun для sun / oracle JDK.Тогда следующей проблемой будут пакеты, определенные в других библиотеках, которые вы, вероятно, используете.

Есть ли способ отфильтровать пакеты так, чтобы остались только те, которые я определил?

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

1 голос
/ 05 марта 2012

Я не знаю ни одного метода из этого ... только для классов.Но вы могли бы создать собственный список, позволив этому запускаться, возможно, сохранив в файле для каждой операционной системы собственную программу.

Package[] pa = Package.getPackages();
for (int i = 0; i < pa.length; i++) {
    Package p = pa[i];
    System.out.print("\"" + p.getName() + "\", ");
}

Затем загрузите этот список и выполните итерации по каждому пакету в другомпрограмма, в которой вы хотите фильтровать пакеты ...

String[] systemPackages = new String[]{<all names of the packages>};
Package[] pa = Package.getPackages();
int n = 0;

for (int i = 0; i < pa.length; i++) {
    Package p = pa[i];
    boolean isSystemPackage = false;
    String pname = p.getName();
    for (int j = 0; j < systemPackages.length; j++) {
        String spname = systemPackages[j];
        if (pname.equals(spname)) {
            isSystemPackage = true;
            systemPackages[j] = null;
            break;
        }
    }
    if (!isSystemPackage) {
        n++;
    } else {
        pa[i] = null;
    }
}

Package[] projectPackages = new Package[n];
for (int i = 0, j = 0; i < pa.length; i++) {
    Package p = pa[i];
    if (p != null) {
        projectPackages[j] = p;
        j++;
    }
}

Так что вы можете проверить это ... конечно, есть разные версии java-библиотек, но я не думаю, что вы хотите использовать это, чтосерьезно хм?

...