Как получить доступ к java-классам в пакете по умолчанию?

Я работаю сейчас вместе с другими в проекте грааль. Мне нужно написать несколько Java-классов. Но мне нужен доступ к объекту с возможностью поиска, созданному с помощью groovy. Кажется, что этот объект должен быть помещен в пакет по умолчанию.

мой вопрос: есть ли способ получить доступ к этому объекту в пакете по умолчанию из Java-класса в именованном пакете?

4 ответов


вы не можете использовать классы в пакете по умолчанию из имени пакета.
(технически вы можете, как показано в шарике Абдуллы ответ через API отражения,но классы из неназванного пространства имен являются не в объеме на импорт декларации)

до J2SE 1.4 можно импортировать классы из пакета по умолчанию, используя следующий синтаксис:

import Unfinished;

вот не допускается. Поэтому для доступа к классу пакета по умолчанию из упакованного класса требуется переместить класс пакета по умолчанию в собственный пакет.

Если у вас есть доступ к источнику, сгенерированному groovy, необходима некоторая постобработка для перемещения файла в выделенный пакет и добавления этой директивы "package" в ее начале.


обновление 2014: ошибка 6975015, для JDK7 и JDK8, опишите четный жесткие запрет на импорт из неназванного пакета.

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


в самом деле, вы можете.

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

Class fooClass = Class.forName("FooBar");
Method fooMethod = fooClass.getMethod("fooMethod", String.class);

String fooReturned = (String)fooMethod.invoke(fooClass.newInstance(), "I did it");

использовать Джаджа для переупаковки файла jar со следующим правилом:

rule * <target package name>.@1

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


вы можете использовать пакеты в Groovy код, и все будет прекрасно работать.

это может означать незначительную реорганизацию кода под grails-app и немного больно сначала, но на большом проекте grails просто имеет смысл организовывать вещи в пакетах. Мы используем соглашение об именовании стандартного пакета Java com.foo.<app>.<package>.

наличие всего в пакете по умолчанию становится препятствием для интеграции, как вы находите.

контроллеры, кажется один артефакт Grails (или артефакт), который сопротивляется помещению в пакет Java. Вероятно, я просто не понял Convention для этого еще. ;-)