Jak uzyskać dostęp do klas java w domyślnym pakiecie?

Pracuję teraz razem z innymi w projekcie grails. Muszę napisać kilka klas Javy. Ale potrzebuję dostępu do przeszukiwalnego obiektu stworzonego za pomocą groovy. Wydaje się, że ten obiekt musi być umieszczony w domyślnym pakiecie.

Moje pytanie brzmi: Czy istnieje sposób dostępu do tego obiektu w domyślnym pakiecie z klasy Java w nazwanym pakiecie?

Author: Viorel Florian, 2008-11-12

4 answers

Nie można używać klas w domyślnym pakiecie z nazwanego pakietu.
(technicznie można, Jak pokazano w odpowiedzi Sharique Abdullah poprzez reflection API, ale klasy z nienazwanej przestrzeni nazw są nie w zakresie W deklaracji importu )

Przed J2SE 1.4 można importować klasy z domyślnego pakietu używając składni takiej jak ta:

import Unfinished;

To Nie jest już dozwolone . Więc aby uzyskać dostęp do domyślnego Klasa pakietu z poziomu spakowanej klasy wymaga przeniesienia domyślnej klasy pakietu do własnego pakietu.

Jeśli masz dostęp do źródła generowanego przez groovy, konieczne jest trochę post-processingu, aby przenieść plik do dedykowanego pakietu i dodać tę dyrektywę "pakiet" na jego początku.


Update 2014: bug 6975015 , dla JDK7 i JDK8, opisz parzysty surowszy zakaz importu z nienazwanych pakietów.

TypeName musi być kanoniczną nazwą typu klasy, typu interfejsu, typu enum lub typu adnotacji.
Typ musi być członkiem nazwanego pakietu , lub członkiem typu, którego najbardziej wysunięty na zewnątrz typ jest członkiem nazwanego pakietu, lub wystąpi błąd w czasie kompilacji .

 117
Author: VonC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:31

W rzeczywistości możesz.

Używając reflections API możesz uzyskać dostęp do dowolnej klasy. Przynajmniej udało mi się:)

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

String fooReturned = (String)fooMethod.invoke(fooClass.newInstance(), "I did it");
 58
Author: Holger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-22 17:29:51

Użyj jarjar aby przepakować plik jar z następującą regułą:

rule * <target package name>.@1

Wszystkie klasy w domyślnym pakiecie źródłowego pliku JAR zostaną przeniesione do pakietu docelowego, dzięki czemu będą mogły uzyskać dostęp.

 6
Author: Sean,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-13 02:37:03

Możesz używać pakietów w kodzie Groovy, a wszystko będzie dobrze działać.

Może to oznaczać drobną reorganizację kodu pod grails-app i trochę bólu na początku, ale w dużym projekcie grails po prostu ma sens organizowanie rzeczy w pakietach. Używamy standardowej Konwencji nazw pakietów Java com.foo.<app>.<package>.

Posiadanie wszystkiego w domyślnym pakiecie staje się przeszkodą w integracji, jak się okazuje.

Controllers seem to the one Grails Artefact (or artefakt), który jest odporny na umieszczenie w pakiecie Java. Prawdopodobnie jeszcze nie rozgryzłem Convention na to. ;-)

 3
Author: Ken Gentle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-12 14:12:20