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?
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 .
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");
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.
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. ;-)
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