Nie możesz używać klas w domyślnym pakiecie z nazwanego pakietu.
( Technicznie można, jak pokazano na Sharique Abdullah za odpowiedź poprzez odbicie API, ale zajęcia z nazw bezimiennego są nie w zakresie w deklaracji importowej )
Przed J2SE 1.4 można było importować klasy z domyślnego pakietu przy użyciu następującej składni:
import Unfinished;
To już nie jest dozwolone . Zatem uzyskanie dostępu do domyślnej klasy pakietu z poziomu klasy pakietu wymaga przeniesienia domyślnej klasy pakietu do osobnego pakietu.
Jeśli masz dostęp do źródła wygenerowanego przez groovy, potrzebne jest pewne przetwarzanie końcowe, aby przenieść plik do dedykowanego pakietu i dodać tę dyrektywę "pakiet" na jego początku.
Aktualizacja 2014: błąd 6975015 , dla JDK7 i JDK8, opisuje jeszcze ostrzejszy zakaz importu z pakietu bez nazwy.
TypeName
Musi być kanoniczna nazwa typu klasy, rodzaju interfejsu, typu enum lub typu adnotacji.
Typ musi być członkiem nazwanego pakietu lub elementem członkowskim typu, którego najbardziej zewnętrznym typem obejmującym leksykalnie jest element członkowski nazwanego pakietu , lub wystąpi błąd w czasie kompilacji .
Andreas zwraca uwagę w komentarzach :
"Dlaczego [pakiet domyślny] jest na pierwszym miejscu? błąd projektu?"
Nie, to celowe.
JLS 7.4.2. Unnamed Packages mówi: „Nienazwane pakiety są dostarczane przez platformę Java SE głównie ze względu na wygodę podczas tworzenia małych lub tymczasowych aplikacji lub na początku programowania”.
W rzeczywistości możesz.
Używając reflections API, możesz uzyskać dostęp do dowolnej dotychczasowej klasy. Przynajmniej udało mi się :)
źródło
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")
Użyj jarjar, aby przepakować plik jar, stosując następującą zasadę:
Wszystkie klasy z domyślnego pakietu źródłowego pliku jar zostaną przeniesione do pakietu docelowego, dzięki czemu będą miały do nich dostęp.
źródło
Możesz używać pakietów w
Groovy
kodzie i wszystko będzie działać dobrze.Może to oznaczać niewielką reorganizację kodu pod
grails-app
i na początku trochę uciążliwą, ale w przypadku dużego projektu Grails sensowne jest organizowanie rzeczy w pakiety. Używamy standardowej konwencji nazewnictwa pakietów Javacom.foo.<app>.<package>
.Posiadanie wszystkiego w domyślnym pakiecie staje się przeszkodą w integracji.
Wydaje się, że to kontrolery są jedynym artefaktem (lub artefaktem) Grailsa, który jest odporny na umieszczenie w pakiecie Java. Prawdopodobnie po prostu jeszcze tego nie rozgryzłem
Convention
. ;-)źródło
żeby zrealizować pomysł:
Z wnętrza pakietu domyślnego można uzyskać dostęp do obiektów znajdujących się w nazwanych pakietach.
źródło