Wie greife ich im Standardpaket auf Java-Klassen zu?


98

Ich arbeite jetzt zusammen mit anderen in einem Grails-Projekt. Ich muss einige Java-Klassen schreiben. Aber ich brauche Zugriff auf ein durchsuchbares Objekt, das mit groovy erstellt wurde. Es scheint, dass dieses Objekt im Standardpaket platziert werden muss.

Meine Frage ist: Gibt es eine Möglichkeit, von einer Java-Klasse in einem benannten Paket aus auf dieses Objekt im Standardpaket zuzugreifen?

Antworten:


129

Sie können im Standardpaket keine Klassen aus einem benannten Paket verwenden.
( Technisch gesehen kann man, wie in Sharique Abdullah gezeigt Antwort durch Reflexion API, sondern Klassen aus dem unbenannter Namen sind in ihrem Umfang nicht in einer Einfuhranmeldung )

Vor J2SE 1.4 konnten Sie Klassen aus dem Standardpaket mit einer Syntax wie der folgenden importieren:

import Unfinished;

Das ist nicht mehr erlaubt . Um von einer Paketklasse aus auf eine Standardpaketklasse zugreifen zu können, muss die Standardpaketklasse in ein eigenes Paket verschoben werden.

Wenn Sie Zugriff auf die von groovy generierte Quelle haben, ist eine Nachbearbeitung erforderlich, um die Datei in ein dediziertes Paket zu verschieben und diese "Paket" -Anweisung am Anfang hinzuzufügen.


Update 2014: Fehler 6975015 für JDK7 und JDK8 beschreibt ein noch strengeres Verbot des Imports aus unbenannten Paketen.

Dies TypeNamemuss der kanonische Name eines Klassentyps, Schnittstellentyps, Aufzählungstyps oder Anmerkungstyps sein.
Der Typ muss entweder ein Mitglied eines benannten Pakets sein oder ein Mitglied eines Typs, dessen äußerster lexikalisch einschließender Typ ein Mitglied eines benannten Pakets ist. Andernfalls tritt ein Fehler bei der Kompilierung auf .


Andreas weist in den Kommentaren darauf hin :

"Warum gibt es [das Standardpaket] überhaupt? Designfehler?"

Nein, es ist absichtlich.
JLS 7.4.2. In unbenannten Paketen heißt es: "Unbenannte Pakete werden von der Java SE-Plattform hauptsächlich zur Vereinfachung bei der Entwicklung kleiner oder temporärer Anwendungen oder zu Beginn der Entwicklung bereitgestellt."


7
Wie ich bereits anderen Leuten erklärt habe, ist das Standardpaket ein Bürger zweiter Klasse in der Java-Welt. Tu das einfach nicht. :-)
Chris Jester-Young

1
Scheint, als müsste ich Groovy (in einem sehr zeitlich begrenzten Projekt) oder Code im Standardpaket lernen. :-(
Mnementh

11
@ ChrisJester-Young wenn ja, warum ist es überhaupt da? Designfehler?
Pacerier

Warum wurde es veraltet?
Suzan Cioc

@SuzanCioc meinst du: "Warum kannst du nach J2SE1.4 nicht mehr auf das Standardpaket zugreifen?"
VonC

61

In der Tat können Sie.

Mit der Reflections-API können Sie bisher auf jede Klasse zugreifen. Zumindest konnte ich :)

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

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

Für Scala funktioniert der folgende Code: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
Tolle Antwort, +1. Da die Frage jedoch groovig war, können Sie Enten-Typisierung verwenden (wie Duct Taping, denke ich) ...Class.forName("FooBar").newInstance().fooMethod("I did it")
Bill K

7

Verwenden Sie jarjar , um die JAR-Datei mit der folgenden Regel neu zu verpacken:

rule * <target package name>.@1

Alle Klassen im Standardpaket der Quell-JAR-Datei werden in das Zielpaket verschoben und können somit darauf zugreifen.


4
Eine Demo zur Verwendung von Jarjar wäre großartig
BiGGZ

@BiGGZ: In der Datei README.md im jarjar github repo erfahren Sie, wie Sie jarjar mit ant, gradle oder der Befehlszeile verwenden.
Lucidiot

3

Sie können Pakete in der verwenden Groovy Code verwenden, und die Dinge werden gut funktionieren.

Es kann eine geringfügige Neuorganisation des Codes unter grails-appund zunächst ein wenig schmerzhaft bedeuten , aber bei einem großen Grails-Projekt ist es nur sinnvoll, die Dinge in Paketen zu organisieren. Wir verwenden die Java-Standardpaket-Namenskonventioncom.foo.<app>.<package> .

Wenn Sie feststellen, dass alles im Standardpaket enthalten ist, wird dies die Integration behindern.

Controller scheinen das einzige Grails-Artefakt (oder Artefakt) zu sein, das sich nicht in ein Java-Paket einfügt. Wahrscheinlich habe ich das noch nicht herausgefunden Convention. ;-);


0

Nur um die Idee zu vervollständigen:

Innerhalb des Standardpakets können Sie auf Objekte zugreifen, die sich in benannten Paketen befinden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.