Java Reflection не работает в моей системе - работает для членов команды - PullRequest
2 голосов
/ 19 ноября 2009

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

Проблема: все раскрывающиеся меню в моей системе пустые. Я не могу за свою жизнь понять, почему они не заселены. Все остальные 5 членов команды работают над своей системой.

Вещи, которые я устал, которые не работали:

1) Установка самого последнего затмения (galileo), потому что оно использовалось командой отдыха
2) Переустановите самый последний выпуск Java (jdk1.6.0-17 и jre6)
3) Проверьте переменные PATH и JAVA_HOME

Есть какие-нибудь мысли относительно того, что еще я могу попробовать, или что-то, что я сделал, должно было решить это, а что нет? Это сводит меня с ума.

Edit: Я должен был прояснить, что мы развиваемся в команде. Мы используем SVN для контроля версий, и все мы используем один и тот же исходный код. Я даже попытался проверить свежую копию всего дерева из SVN, но у меня была та же проблема с отражением в моей системе, пока она работала для товарищей по команде.

Команда создала исполняемый файл jar, который отлично работал на всех системах, кроме моей. У меня все работало, кроме бита отражения.

Ответы [ 4 ]

6 голосов
/ 19 ноября 2009

Вам нужно отладить ваше приложение. Это означает, что вы должны систематически исследовать возможные причины проблемы. Вот некоторые вещи, которые приходят на ум:

  • Может быть, ваш графический интерфейс не работает, а не отражается? Что если вы выводите с System.out.println() вместо вашего меню?

  • Выдает ли ваш код отражения исключение и игнорируете ли вы его?

  • Ваш код отражения на самом деле вызывается? Бросьте туда println(), чтобы быть уверенным!

  • Испытывает ли интерфейс на наличие опечатки или подобной ошибки, которая вызывает его сбой? Попробуйте найти классы, которые реализуют Serializable вместо этого!

  • Тест на отражение выполняется в главном потоке и пытается обновить графический интерфейс? Вам нужно использовать SwingUtilities.invokeAndWait, чтобы получить обновление рабочего потока Swing.

  • Вы работаете с Eclipse; Eclipse имеет фантастический отладчик. Установите точку останова рядом с тем местом, где находится ваше основное действие, а затем выполните один шаг по коду.

2 голосов
/ 19 ноября 2009

PATH и JAVA_HOME не помогут. PATH влияет только на динамически связанные библиотеки («нативный код»). JAVA_HOME - переменная сценария, которая используется некоторыми утилитами на основе Java, такими как Ant и Tomcat; это ничего не значит для самой среды выполнения Java.

Вам нужно исследовать classpath, , который должен быть задан параметром -classpath для команды java, в Build Path в свойствах вашего проекта Eclipse или в Class-Path атрибут основного раздела файла JAR, если вы запускаете java с опцией -jar.

Из вашего кода вы сможете составить список содержимого вашего classpath, изучив системное свойство, "java.class.path"

System.out.println(System.getProperty("java.class.path"));
1 голос
/ 20 ноября 2009

Решение проблемы:

В пути к исходному коду не должно быть пробелов.

Я использую Windows XP, и по какой-либо причине, если в пути к классам, который ведет к файлу JAR или к исходному коду, использующему отражение, есть пробелы, отражение не выполняется.

Я взял файл jar, который работает для всей моей команды, и запустил его из C: \ в моей системе, и отражение работало отлично.

Я не знаю, почему это так, пожалуйста, прокомментируйте, если знаете, что происходит.

0 голосов
/ 19 ноября 2009

Возможно, это длинный путь, но нужно искать различия в настройках безопасности для вас и ваших партнеров по команде. Статья с подробным описанием http://www.ibm.com/developerworks/library/j-dyn0603/ рубрики "Безопасность и рефлексия"

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