Як отримати доступ до java-класів у пакеті за замовчуванням?


98

Зараз я спільно з іншими працюю над проектом із грааль. Я повинен написати кілька Java-класів. Але мені потрібен доступ до об'єкта для пошуку, створеного з groovy. Здається, що цей об'єкт повинен бути розміщений у пакеті за замовчуванням.

Моє запитання: Чи є спосіб отримати доступ до цього об’єкта в пакеті за замовчуванням з класу Java в іменованому пакеті?

Відповіді:


129

Ви не можете використовувати класи в пакеті за замовчуванням з названого пакету.
( Технічно ви можете, як показано на Sharique Абдулла відповіді через Reflection API, але класи від безіменного простору імен знаходяться не в обсязі в декларації імпорту )

До J2SE 1.4 ви могли імпортувати класи з пакету за замовчуванням, використовуючи такий синтаксис:

import Unfinished;

Це більше не дозволено . Отже, для доступу до класу пакетів за замовчуванням із упакованого класу потрібно перемістити клас пакунків за замовчуванням у власний пакет.

Якщо у вас є доступ до джерела, згенерованого groovy, потрібна деяка післяобробка, щоб перемістити файл у виділений пакет і додати цю директиву "пакет" на його початку.


Оновлення 2014: помилка 6975015 , для JDK7 і JDK8, описує ще суворіше заборона на імпорт з неназваного пакета.

TypeNameПовинно бути канонічне ім'я типу класу, тип інтерфейсу, перечислимого типу, або типу анотацій.
Тип повинен бути або членом названого пакету , або членом типу, чий зовнішній лексично огороджуючий тип є членом названого пакету , або виникає помилка часу компіляції .


Андреас балів з в коментарях :

"чому в першу чергу існує [пакет за замовчуванням]? Помилка дизайну?"

Ні, це навмисно.
JLS 7.4.2. Безназвані пакети зазначають: "Пакети без назви надаються платформою Java SE в основному для зручності під час розробки невеликих або тимчасових додатків або тільки коли починається розробка".


7
Як я вже пояснював іншим людям, пакет за замовчуванням - це громадянин другого класу в світі Java. Просто не роби цього. :-)
Кріс Єстер-Янг

1
Здається, я повинен вивчити Groovy (за дуже обмеженим часом) або код у пакеті за замовчуванням. :-(
Mnementh

11
@ ChrisJester-Young, якщо так, то чому це там в першу чергу? помилка дизайну?
Пейсьєр

Чому його застаріли?
Сузан Чоок

@SuzanCioc ви маєте на увазі: "чому після J2SE1.4 ви більше не можете отримати доступ до пакету за замовчуванням?"
VonC

61

Насправді можна.

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

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

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

Для Scala працює такий код:val bar = "hi"; val fooClass = Class.forName("FooClass"); val fooMethod = fooClass.getMethod("foo", classOf[Array[String]]); val fooReturned = fooMethod.invoke(fooClass.newInstance(), Array(bar));
Jus12

2
Чудова відповідь, +1. Оскільки питання було непростим, проте, ви можете використовувати набір качок (як, мабуть, наклеювання каналів, я думаю) ...Class.forName("FooBar").newInstance().fooMethod("I did it")
Білл К

7

Використовуйте jarjar, щоб перепакувати файл jar із наступним правилом:

rule * <target package name>.@1

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


4
демонстрація того, як використовувати jarjar, була б чудовою
BiGGZ

@BiGGZ: Див. README.md файл на jarjar github repo, щоб побачити, як використовувати jarjar з мурашкою, gradle або командним рядком.
Lucidiot

3

Ви можете використовувати пакети в Groovyкоді, і все буде добре.

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

Якщо ви знаходите все в пакеті за замовчуванням, це перешкоджає інтеграції, як ви знаходите.

Здається, що контролери - це той самий артефакт Грааля (або артефакт), який чинить опір укладанню в пакет Java. Напевно, я просто ще цього не зрозумів Convention. ;-)


0

просто для завершення ідеї:

Зсередини пакету за замовчуванням ви можете отримати доступ до об'єктів, розміщених у названих пакетах.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.