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


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

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

4 87

4 ответа:

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

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

import Unfinished;

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

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


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

The 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 для этого еще. ; -)