Mögliches Duplikat: Wie greife ich im Standardpaket auf Java-Klassen zu?
Ich verwende Eclipse 3.5 und habe ein Projekt mit einer Paketstruktur zusammen mit dem Standardpaket erstellt. Ich habe eine Klasse im Standardpaket - Calculations.java und möchte diese Klasse in jedem Paket verwenden (zum Beispiel in com.company.calc
). Wenn ich versuche, die im Standardpaket enthaltene Klasse zu verwenden, erhalte ich einen Compilerfehler. Die Klasse im Standardpaket kann nicht erkannt werden. Wo ist das Problem?
Calculations.java - Quellcode
public class Calculations {
native public int Calculate(int contextId);
native public double GetProgress(int contextId);
static {
System.loadLibrary("Calc");
}
}
Ich kann meine Klasse nicht in ein anderes Paket packen. Diese Klasse verfügt über einige native Methoden, die in Delphi implementiert sind. Wenn ich diese Klasse in einen der Ordner lege, muss ich Änderungen an der DLL vornehmen, die ich vermeiden möchte (wirklich - ich kann nicht). Deshalb habe ich meine Klasse in das Standardpaket aufgenommen.
quelle
Antworten:
Aus der Java-Sprachspezifikation :
Sie müssen über Reflektion oder eine andere indirekte Methode auf die Klasse zugreifen.
quelle
Klassen im Standardpaket können nicht von Klassen in Paketen importiert werden. Aus diesem Grund sollten Sie das Standardpaket nicht verwenden.
quelle
Es gibt eine Problemumgehung für Ihr Problem. Sie können Reflexion verwenden, um dies zu erreichen.
Zuerst eine Schnittstelle schaffen für Ihre Zielklasse
Calculatons
:Stellen Sie als Nächstes sicher, dass Ihre Zielklasse diese Schnittstelle implementiert :
Schließlich Verwendung Reflexion eine Instanz erstellen
Calculations
Klasse und weisen Sie auf eine Variable vom TypCalculationsInterface
:quelle
Ich kann Ihnen diesen Vorschlag machen. Soweit ich aus meiner C- und C ++ - Programmiererfahrung weiß, habe ich ihn einmal, als ich das gleiche Problem hatte, gelöst, indem ich die geschriebene DLL-Struktur in der ".C" -Datei geändert habe, indem ich den Namen der geändert habe Funktion, die die native JNI-Funktionalität implementiert. Wenn Sie beispielsweise Ihr Programm zum Paket "com.mypackage" hinzufügen möchten, ändern Sie den Prototyp der JNI-implementierenden Funktion / Methode der ".C" -Datei in diesen:
Da ich neu bei Delphi bin, kann ich Ihnen keine Garantie geben, werde dies aber abschließend sagen (ich habe einige Dinge gelernt, nachdem ich über Delphi und JNI gegoogelt habe): Fragen Sie die Leute (wenn Sie nicht derjenige sind), die die Delphi-Implementierung des Eingeborenen bereitgestellt haben Code zum Ändern der Funktionsnamen in etwa:
Aber ein letzter Ratschlag: Obwohl Sie (wenn Sie der Delphi-Programmierer sind) oder sie die Prototypen dieser Funktionen ändern und die DLL-Datei neu kompilieren, können Sie den Paketnamen von Ihnen nicht ändern, sobald die DLL-Datei kompiliert ist "Java" -Datei immer wieder. Dafür müssen Sie oder sie erneut die Prototypen der Funktionen in delphi mit geänderten Präfixen ändern (z. B. JAVA_yourpackage_with_underscores_for_inner_packages_JavaFileName_MethodName).
Ich denke, das löst das Problem. Danke und Grüße, Harshal Malshe
quelle
Von einigen, wo ich unten gefunden habe: -
In der Tat können Sie.
Mit der Reflections-API können Sie bisher auf jede Klasse zugreifen. Zumindest konnte ich :)
quelle
Leider können Sie eine Klasse nicht importieren, ohne sie in einem Paket zu haben. Dies ist einer der Gründe, warum davon dringend abgeraten wird. Was ich versuchen würde, ist eine Art Proxy - fügen Sie Ihren Code in ein Paket ein, das alles verwenden kann, aber wenn Sie wirklich etwas im Standardpaket benötigen, machen Sie dies zu einer sehr einfachen Klasse, die Aufrufe an die Klasse mit dem realen Code weiterleitet. Oder, noch einfacher, lassen Sie es einfach verlängern.
Um ein Beispiel zu geben:
quelle
Erstellen Sie ein neues Paket. Verschieben Sie dann die Klassen des Standardpakets in ein neues Paket und verwenden Sie diese Klassen
quelle
quelle
Erstellen Sie beispielsweise ein "Root" -Paket (Ordner) in Ihrem Projekt.
Paketquelle; (... / path_to_project / source /)
Verschieben Sie YourClass.class in einen Quellordner. (... / path_to_project / source / YourClass.class)
So importieren
import source.YourClass;
quelle