Вы не можете использовать классы в пакете по умолчанию из именованного пакета.
( Технически вы можете, как показано на Sharique Абдулла ответа через Reflection API, но классы от безымянного пространства имен находятся не в объеме в декларации импорта )
До J2SE 1.4 вы могли импортировать классы из пакета по умолчанию, используя такой синтаксис:
import Unfinished;
Это больше не разрешено . Таким образом, для доступа к классу пакета по умолчанию из упакованного класса необходимо переместить класс пакета по умолчанию в собственный пакет.
Если у вас есть доступ к источнику, сгенерированному Groovy, потребуется некоторая пост-обработка, чтобы переместить файл в специальный пакет и добавить эту директиву «package» в его начало.
Обновление 2014: ошибка 6975015 , для JDK7 и JDK8, описывает еще более строгий запрет на импорт из безымянного пакета.
TypeName
Должно быть каноническое имя типа класса, тип интерфейса, перечислимого типа, или типа аннотаций.
Тип должен быть либо членом именованного пакета , либо членом типа, самый внешний лексически включающий тип которого является членом именованного пакета , в противном случае возникает ошибка времени компиляции .
Андреас отмечает в комментариях :
"почему [пакет по умолчанию] там вообще? ошибка дизайна?"
Нет, это умышленно.
JLS 7.4.2. Безымянный пакет говорит: «Безымянный пакет предоставляется платформой Java SE в основном для удобства при разработке небольших или временных приложений или когда только начинается разработка».
Фактически, вы можете.
Используя API отражений, вы можете получить доступ к любому классу на данный момент. По крайней мере, мне удалось :)
источник
val bar = "hi"; val fooClass = Class.forName("FooClass"); val fooMethod = fooClass.getMethod("foo", classOf[Array[String]]); val fooReturned = fooMethod.invoke(fooClass.newInstance(), Array(bar));
Class.forName("FooBar").newInstance().fooMethod("I did it")
Используйте jarjar, чтобы переупаковать файл jar по следующему правилу:
Все классы в пакете по умолчанию исходного файла jar будут перемещены в целевой пакет, таким образом, они смогут получить доступ.
источник
Вы можете использовать пакеты в
Groovy
коде, и все будет работать нормально.Это может означать небольшую реорганизацию кода
grails-app
и поначалу небольшую боль, но в большом проекте Grails просто имеет смысл организовать вещи в пакетах. Мы используем стандартное соглашение об именах пакетов Javacom.foo.<app>.<package>
.Как вы обнаружите, наличие всего в пакете по умолчанию становится препятствием для интеграции.
Контроллеры кажутся единственным артефактом (или артефактом) Grails, который сопротивляется помещению в пакет Java. Наверное, я просто еще не понял, в
Convention
чем дело. ;-)источник
просто для завершения идеи:
Изнутри default-package вы можете получить доступ к объектам, находящимся в названных пакетах.
источник