использование фрагментов над плагином

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

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

Однако я не понял смысла строки ниже.

Если мы создадим тесты в плагине eclipse, тестовые классы будут загружены отдельным загрузчиком классов и, следовательно, не будут иметь доступа к закрытым методам тестируемых классов.

Почему у него нет доступа к непубличным методам? может ли кто-нибудь помочь мне понять смысл вышеизложенного на простом примере?


person user414967    schedule 18.05.2015    source источник
comment
я был бы очень заинтересован в хорошем ответе на эту тему! меня тоже этот вопрос волнует....   -  person Martin Frank    schedule 18.05.2015
comment
Если у вас есть пакет my.awesome.plugin в плагине MyAwesomePlugin и пакет my.awesome.plugin в плагине MyAwesomePluginTests, это совершенно разные пакеты, которые просто имеют одно и то же имя.   -  person user253751    schedule 18.05.2015


Ответы (1)


Чтобы понять это, вам нужно понять, как на самом деле работают классы и загрузка классов в Java. Часто мы думаем о загрузке с точки зрения «пути к классам», но это сильно упрощает то, как все работает. Во многих средах Java SE это просто работает, но в средах с несколькими арендаторами, таких как OSGi, все становится сложнее.

По сути, классы Java ограничены тремя вещами:

  1. Имя
  2. Упаковка
  3. ClassLoader

Вполне возможно, что два экземпляра myPackage.MyClass будут загружены в JVM более одного раза, вам просто нужно несколько загрузчиков классов. Несмотря на то, что эти классы могут быть загружены из идентичных файлов .class, они будут отличаться во время выполнения. Это может вызвать много путаницы, когда вы пишете такой код:

MyClass c = (MyClass)obj;

и получить ClassNotFoundException: MyClass.

Классы существуют в пакетах, и с этим связаны специальные правила видимости. Типы, методы и поля, для которых не указана видимость, видны всем типам в одном пакете. Когда класс загружается, он связывается с java.lang.reflect.Package, и правила видимости разрешаются путем проверки того, что классы связаны с одним и тем же экземпляром java.lang.reflect.Package. Таким образом, в случае mypackage.MyClass, если вы загрузите его дважды, используя два разных загрузчика классов, вы получите два экземпляра Package для mypackage.

OSGi разработан для поддержки загрузки классов с несколькими арендаторами, это то, что позволяет вам одновременно иметь две разные версии класса или пакета в одной и той же JVM. Это решает многие проблемы, возникающие, если у вас разные зависимости от версии. Он реализует это, используя разные загрузчики классов для каждого пакета. Фрагменты работают иначе, чем пакеты, поскольку они связаны с пакетом, а классы в них загружаются загрузчиком классов пакета, а не собственным.

Чтобы связать это с вашим первоначальным вопросом, если вы поместите свои тесты junit в пакет (а не во фрагмент), ваш класс будет загружен другим загрузчиком классов, поэтому он будет связан с другим экземпляром java.lang.reflect. Упакуйте так, чтобы когда JVM тестировала доступность члена, она не удалась.

person Alasdair    schedule 11.06.2015