Klassen ServiceLoader Problem

devis

Mitglied
Hallo, ich komme momentan überhaupt nicht mit meinem Problem weiter.
In "Java ist auch eine Insel" steht, dass es sich mit ServiceLoader Programme realisieren lassen, die von konkreten Klassen unabhängig sind.
Das habe ich nun Versucht.
Es gibt eine Schnittstelle A. Es gibt eine konkrete Klasse die diese Schnittstelle implementiert B(A).

Nun gibt es eine dritte Klasse C, die mit Hilfe von ServieceLoader unabhängig von B sein soll.

Also Schreibe ich in C:

ServiceLoader<A> A_process = ServiceLoader.load(A.class);

Dabei erstelle ich unter "scr/META-INF/services" eine Datei mit dem Namen "packetnameInterface".A
Diese Datei hat kein Dateiende.
In die Datei schreibe ich: "paketNameKonkreteKlasse".B

Wenn ich nun versuche aus C heraus B zu starten: A.process.iterator().next();

Kommt exception: NosuchelementException .....

was habe ich falsch gemacht???
:shock:
 
Zuletzt bearbeitet:

devis

Mitglied
hier ist ein konkreter Programm beispiel:
Java:
package file_manager;

import java.util.ServiceLoader;
import file_manager.abstract_iterface_class.A

public final class C {
    
      static ServiceLoader<A> gui = ServiceLoader.load(A.class);
      

        
    public static void main(String args[]) {

       gui.iterator().next();
            
    }

Java:
package file_manager.abstract_iterface_class;

/**
 *
 * @author Gast_Student
 */
public interface A{
    
    
    
}

Java:
package file_manager;

public class B impliments A{

}
 
Zuletzt bearbeitet:
N

nillehammer

Gast
Code:
Dabei erstelle ich unter "scr/META-INF/services" eine Datei mit dem Namen "packetnameInterface".A
Wie sind denn Deine Compile-Einstellungen? Landet die Datei denn so im Zielordner für den compilierten Kram?
 

devis

Mitglied
Code:
Dabei erstelle ich unter "scr/META-INF/services" eine Datei mit dem Namen "packetnameInterface".A
Wie sind denn Deine Compile-Einstellungen? Landet die Datei denn so im Zielordner für den compilierten Kram?

Also ich arbeite mit netbeans.. und wenn mit "compilierter kram" der ordner build gemeint ist, dann ist da tatsächlich der Ordner META-INF zu finden.. wurde wahrscheinlci beim compilieren von scr nach build kopiert..
PS: und die Datei ist ebenfalls da drine
 

haui95

Bekanntes Mitglied
Poste die Exception doch bitte einmal. In welcher Zeile deines Codes meckert der Compiler? Wenn der Fehler sich nicht auf die Schnelle erschließen lässt, dann debugge dein Programm doch einmal in dem du Breakpoints setzt.

MfG
 
Zuletzt bearbeitet:

devis

Mitglied
Poste die Exception doch bitte einmal. In welcher Zeile deines Codes meckert der Compiler? Wenn der Fehler nicht sich nicht auf die Schnelle erschließen lässt, dann debugge dein Programm doch einmal.

MfG

Wie gesagt.. in der exception steht nichts anderes als NoSuchElementException..

Der Compiler meckert bei aufruf der folgender Zeile in Main:


Java:
gui.iterator().next();

Meine vermutung ist, dass er einfach die konkrete Klasse B nicht finden kann die A implimentiert.. die frage ist warum??..???:L
 

devis

Mitglied
Java:
run:
Exception in thread "main" java.util.NoSuchElementException
	at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:357)
	at java.util.ServiceLoader$1.next(ServiceLoader.java:445)
	at file_manager.C.main(C.java:59)
Java Result: 1
BUILD SUCCESSFUL (total time: 2 seconds)

Das ist die Exception
 
N

nillehammer

Gast
Gut (oder auch nicht). Ich habe gerade in einem Testprojekt (allerdings "leider" Eclipse) verschiedene Fehlerfälle ausprobiert. Der von Dir beschriebene kommt nur, wenn Java die Datei nicht findet. Als Referenz meine Ordnerstruktur im build-Ordner (bei mir heißt der nach Maven-Konvention target)
  • target/classes/de/... <-- Die ganzen Klassen in ihren Packages plus evtl zugehörige Resourcen (properties-Dateien etc
  • target/classes/META-INF/services/interfacePackageUndName
Damit klappt's bei Eclipse-Run. Was ich damit eigentlich nur zeigen will, ist dass alles zusammen liegen muss, damit's im Classpath liegt. Möglicherweise kannst Du Netbeans entsprechend konfigurieren.
 

devis

Mitglied
es liegt bei mir aber praktisch identisch mit deinem ausser dass es bei mir buid statt target heißt..
seltsam.. und bei dir funktioniert alles?
 
N

nillehammer

Gast
Japp, ich habe eine
Code:
java.io.FileFilter
-Implementierung geschrieben, die Datei "java.io.FileFilter" in META-INF/services/ erzeugt, dort den voll qualifizierten Klassennamen der Impl-Klasse eingetragen und dann folgenden Code zum Testen ausgeführt:
Java:
public static void main(String[] args) throws Exception {

    ServiceLoader<FileFilter> loader = ServiceLoader.load(FileFilter.class);

    System.out.println(loader);

    final Iterator<FileFilter> iter = loader.iterator();

    while (iter.hasNext()) {

      System.out.println(iter.next());
    }
Es zeigt mir genau eine Implementierungsinstanz an (genau die, die ich registriert habe). Das Programm lässt sich sowohl in Eclipse als auch von Kommandozeile mittels java-Aufruf ausführen.
 

devis

Mitglied
Danke fuer die Hilfe, ich habe mien fehler gefunden.. und zwar habe ich den ordner falsch benannt wo die interface .class dateien lagen.. anstatt interface im Namen hinzuschreiben hatte ich da iterface stehen gehabt.. im Namen der Datei die im META ordner liegt hatte ich aber richtig interface stehen gehabt.. :)

Allerdings habe ich gemerkt, dass man mit so einer methode nicht auf Konstruktor der Konkreten Klassendatei zugreifen hat, weshalb ich einfach zu objekt erstellung der konkreten klassen zurück muss ..

Wie lässt sich sonst mit ServiceLoader auf Konstruktor der implimetierenden Datei zugreifen?
 
N

nillehammer

Gast
Allerdings habe ich gemerkt, dass man mit so einer methode nicht auf Konstruktor der Konkreten Klassendatei zugreifen hat, weshalb ich einfach zu objekt erstellung der konkreten klassen zurück muss ..
Musst Du doch nicht. Der ServiceLoader ruft doch automatisch den public no-arg Konstruktor auf und Du hast Deine Instanz. Oder willst Du einen anderen verwenden?

Wie lässt sich sonst mit ServiceLoader auf Konstruktor der implimetierenden Datei zugreifen?
Wenn Du vorher nicht weißt, welche Konstruktoren es gibt, mit Reflection. Dann brauchste aber ServiceLoader überhaupt nicht bzw. es funktioniert auch nicht, wenn es keinen public no-arg Konstruktor gibt. Dann wäre Class.forName das Mittel der Wahl um Namen von Klassen zu konfigurieren, die man gerne laden möchte.
 

devis

Mitglied
Musst Du doch nicht. Der ServiceLoader ruft doch automatisch den public no-arg Konstruktor auf und Du hast Deine Instanz. Oder willst Du einen anderen verwenden?

ich habe eine grafische Benutzeroberfläche programmiert. In dieser Klassendatei werden aber die meiste Events deklariert. Das heißt, der Klassaendatei mit grafischen Benutzeroberfläche müssen anere Klassenobjekte die für verarbeitung verantwortlich sind übergeben werden.
Das heißt der Konstruktor der GUI Klasse ist prametrisiert.
Ich habe gedacht den erstml mit Servce Loader irgendwie initialisieren zu können.

Wenn Du vorher nicht weißt, welche Konstruktoren es gibt, mit Reflection. Dann brauchste aber ServiceLoader überhaupt nicht bzw. es funktioniert auch nicht, wenn es keinen public no-arg Konstruktor gibt. Dann wäre Class.forName das Mittel der Wahl um Namen von Klassen zu konfigurieren, die man gerne laden möchte.

Von reflectionen hab eich noch keine Ahnung wie das funktionieren sollte.
 
N

nillehammer

Gast
Von reflectionen hab eich noch keine Ahnung wie das funktionieren sollte.
Das macht nichts ;), braucht man auch eher selten. Für Deinen Anwendungsfall wäre das auch nicht das Mittel der Wahl. Du hast ja eine GUI-Klasse, bei der Du die Konstruktoren kennst. Instanziere sie doch einfach direkt z.B. in der main und versorge sie mit den benötigten Services. Ggf. kann Dir ein Dependency Injection Framework einen Teil der Arbeit abnehmen. ServiceLoader ist hier wohl nicht das geeignete Mittel.
 

devis

Mitglied
Das macht nichts ;), braucht man auch eher selten. Für Deinen Anwendungsfall wäre das auch nicht das Mittel der Wahl. Du hast ja eine GUI-Klasse, bei der Du die Konstruktoren kennst. Instanziere sie doch einfach direkt z.B. in der main und versorge sie mit den benötigten Services. Ggf. kann Dir ein Dependency Injection Framework einen Teil der Arbeit abnehmen. ServiceLoader ist hier wohl nicht das geeignete Mittel.

Habe das jetzt auf folge art und weise gemacht.

Java:
 public static void main(String args[]) {
    ServiceLoader<Data_Process_Model> dat_process = ServiceLoader.load(Data_Process_Model.class);
      ServiceLoader<D_Base_Write_Read_able> d_base = ServiceLoader.load(D_Base_Write_Read_able.class);
      GUI gui = new GUI(dat_process.iterator().next(),d_base.iterator().next());
      gui.setVisible(true);
       
    }
:oops:
 
N

nillehammer

Gast
Sieht gut aus!

Außer den Unterschrichen in den Klassen- und Variablennamen. Das ist in Java sehr unüblich. Da benutzt man für zusammengesetzte Würder sog. CamelCase-Notation, bei Variablen mit Kleinbuchstaben beginnend, bei Klassennamen mit Großbuchstaben. Unterschriche werden in Java eigentlich nur bei static final "Konstanten" benutzt, weil hier alle Buchstaben groß sind und man deswegen CamelCase nicht anwenden kann. Zur Veranschaulichung mal folgendes Beispiel:
Java:
// camel case im Klassennamen zum Zusammensetzen von Wörtern
// geht auch mit Englisch (MySpecialGuiClass)
public class MeineSpezielleGuiKlasse {

  // static final "Konstante" hier nur Großbuchstaben
  // deswegen Wortzusammensetzung mit Unterstrich
  private static final int EMPTY_LENGTH = 0;

  // Variablennamen mit Kleinbuchstaben beginnend
  // dann camel case für Zusammensetzen von Wörtern
  private int screenWidth;

Ach ja, für Package-Namen gilt die gleiche Konvention wie für variablen (beginne mit Kleinbuchstaben, dann ggf. camel case, keine Unterstriche). Ich mach in Package Namen aber meist kein camel-case, weil auf UNIXEN Pfade case sensitiv sind und mich die Großbuchstaben nerven, wenn ich sie in der Konsole eingeben muss.
 
Zuletzt bearbeitet von einem Moderator:
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Verständnis Problem bei Server/Client Java Basics - Anfänger-Themen 2
I WildFily - unterschiedliche Libs im Projekt verursachen Problem Java Basics - Anfänger-Themen 11
imocode Vererbung Problem mit Vererbung Java Basics - Anfänger-Themen 2
L Taschenrechner Problem Java Basics - Anfänger-Themen 4
I Applikationsserver (WildFly) - Zugriff auf Ressourcen.. Problem mit Pfade Java Basics - Anfänger-Themen 10
A ScheduledExecutorService problem Java Basics - Anfänger-Themen 7
marcelnedza Problem mit Weltzuweisung, JavaKarol Java Basics - Anfänger-Themen 13
XWing Methoden rückgabe Problem? Java Basics - Anfänger-Themen 6
M Erste Schritte Collatz Problem max int Java Basics - Anfänger-Themen 3
M Problem bei verschachtelter for-Schleife bei zweidimensionalen Arrays Java Basics - Anfänger-Themen 3
C GLOOP Problem beim Erstellen der Kamera Java Basics - Anfänger-Themen 9
nelsonmandela Problem bei Ausgabe einer Switch - Case Funktion Java Basics - Anfänger-Themen 5
frager2345 Problem mit Methode Java Basics - Anfänger-Themen 4
L Problem bei Rechnung mit Math.pow Java Basics - Anfänger-Themen 13
A Thread-Schreibe-Lese-Problem Java Basics - Anfänger-Themen 4
SUPERTJB return Problem Java Basics - Anfänger-Themen 3
sserio BigInteger Problem Java Basics - Anfänger-Themen 4
JordenJost Taschenrechner problem Java Basics - Anfänger-Themen 5
K Problem mit "Random" Java Basics - Anfänger-Themen 5
S Datei anlegen Problem! Groß- und Kleinschreibung wird nicht unterschieden Java Basics - Anfänger-Themen 4
sserio Problem beim Anzeigen Java Basics - Anfänger-Themen 5
xanxk Problem For-Schleife mit Charakter Java Basics - Anfänger-Themen 2
L Unbekanntes Problem mit 2d Array Java Basics - Anfänger-Themen 6
sserio Liste erstellt und ein Problem mit dem Index Java Basics - Anfänger-Themen 8
sserio Schwimmen als Spiel. Problem mit to String/ generate a card Java Basics - Anfänger-Themen 4
J Schleife Problem Java Basics - Anfänger-Themen 2
D Problem mit der Erkennung von \n Java Basics - Anfänger-Themen 2
milan123 das ist meine aufgabe ich hab das problem das bei mir Wenn ich die Richtung der Linien verändern will und drei davon sind richtig, verändere ich die 4 Java Basics - Anfänger-Themen 3
M Verständins Problem bei Aufgabe Java Basics - Anfänger-Themen 4
HeiTim Problem mit der Kommasetzung an der richtigen stelle Java Basics - Anfänger-Themen 59
Temsky34 Problem mit dem Code Java Basics - Anfänger-Themen 17
P Problem mit Calendar.getDisplayName() Java Basics - Anfänger-Themen 8
C Problem mit mehreren Methoden + Scanner Java Basics - Anfänger-Themen 5
P Datei einlesen, nach Begriff filtern und in Datei ausgeben. Problem Standardausgabe über Konsole Java Basics - Anfänger-Themen 19
M Problem mit Klassenverständnis und Button Java Basics - Anfänger-Themen 8
EchtKeineAhnungManchmal hallo habe ein Problem mit einer Datei -> (Zugriff verweigert) Java Basics - Anfänger-Themen 4
H Problem mit Verzweigungen Java Basics - Anfänger-Themen 6
H Problem mit Rückgabewert Java Basics - Anfänger-Themen 7
josfe1234 JAVA FX problem Java Basics - Anfänger-Themen 3
A Code Problem Java Basics - Anfänger-Themen 6
Henri Problem von Typen Java Basics - Anfänger-Themen 7
J Problem mit "ArrayIndexOutOfBoundsException" Java Basics - Anfänger-Themen 11
K jackson Mapping - Problem mit Zeitzonen Java Basics - Anfänger-Themen 10
B Threads Problem mit mehreren Threads Java Basics - Anfänger-Themen 38
I Output BigDecimal anstatt double / Problem beim Rechnen Java Basics - Anfänger-Themen 16
D Schleifen Problem Java Basics - Anfänger-Themen 2
H So viele Fehlermeldungen, dass ich nicht weiß wo das Problem ist. Java Basics - Anfänger-Themen 6
J JAVA-Problem blockiert MEDIATHEKVIEW Java Basics - Anfänger-Themen 13
T Problem mit Lehrzeichen und String bei einfacher Chiffre Java Basics - Anfänger-Themen 8
J extends Problem Java Basics - Anfänger-Themen 2
C Polymorphie-Problem Java Basics - Anfänger-Themen 3
Kalibru Problem bei Ausgabe von Objekt Java Basics - Anfänger-Themen 1
I Format Problem mit Wert - bekomme 0,10 anstatt 10,00 Java Basics - Anfänger-Themen 6
J Problem mit einer Methode die gewissen Inhalt einer Array löschen soll Java Basics - Anfänger-Themen 9
J Problem mit einer Methode, die beliebig viele Objekte in Array speichern soll Java Basics - Anfänger-Themen 6
J Allgemeines Problem mit Klassen Java Basics - Anfänger-Themen 5
U Problem mit dem initialisieren meines Strings in einer Schleife Java Basics - Anfänger-Themen 5
amgadalghabra algorithmisches Problem Java Basics - Anfänger-Themen 19
J Traveling Salesman Problem [Arrays] Java Basics - Anfänger-Themen 9
R ArrayList Problem Java Basics - Anfänger-Themen 6
InfinityDE Problem mit Datenübergabe an Konstruktor Java Basics - Anfänger-Themen 7
C RegEx Problem Java Basics - Anfänger-Themen 4
J Anfänger TicTacToe, Problem bei Gewinnoption, sowohl Unentschieden Java Basics - Anfänger-Themen 8
E Taschenrechner GUI Problem mit Fehlerhandling Java Basics - Anfänger-Themen 6
M Input/Output Fallunterscheidung Problem Java Basics - Anfänger-Themen 17
P Problem beim Überschreiben einer vererbten Methode Java Basics - Anfänger-Themen 4
M Problem bei Ausgabe Java Basics - Anfänger-Themen 7
Splayfer Java Array Problem... Java Basics - Anfänger-Themen 2
G Problem bei der Ausgabe einer Main Claase Java Basics - Anfänger-Themen 7
F Problem mit KeyListener in kombination mit dem ActionListener Java Basics - Anfänger-Themen 4
G Subset sum problem mit Backtracking Java Basics - Anfänger-Themen 18
N Problem mit Scanner Java Basics - Anfänger-Themen 2
J Klassen Problem Java Basics - Anfänger-Themen 8
A Out.format problem. Java Basics - Anfänger-Themen 3
J Problem bei der Programmierung eines Tannenbaums Java Basics - Anfänger-Themen 9
A Array problem Java Basics - Anfänger-Themen 16
2 Taschenrechner mit GUI Problem bei der Berechnung Java Basics - Anfänger-Themen 8
W Remote Method Invocation RMI - Problem Java Basics - Anfänger-Themen 0
I Ich habe ein Problem Java Basics - Anfänger-Themen 3
A Problem bei returnen eines Wertes Java Basics - Anfänger-Themen 6
M Regex Erstellung Problem Java Basics - Anfänger-Themen 2
D Input/Output Problem bei der Benutzereingabe eines Befehls Java Basics - Anfänger-Themen 14
M (Sehr großes Problem) Listen als static in anderen Klassen verwendet Java Basics - Anfänger-Themen 12
F Habe ein problem mit dem ActionListener Java Basics - Anfänger-Themen 3
C Regex-Problem Java Basics - Anfänger-Themen 4
J Problem beim vergleich von zwei Integer Java Basics - Anfänger-Themen 3
M Problem in der Modellierung Java Basics - Anfänger-Themen 20
W Wo ist das URL-Problem ? Java Basics - Anfänger-Themen 1
S Generics-Problem: Class, Class<?>, Class<Object> Java Basics - Anfänger-Themen 4
D FileWriter / FileReader Problem Java Basics - Anfänger-Themen 10
G Problem beim Speichern von Objekten in einer Datei Java Basics - Anfänger-Themen 7
S Compiler-Fehler Exception in thread "main" java.lang.Error: Unresolved compilation problem: Java Basics - Anfänger-Themen 6
J Problem mit Array: 2 Klassen Java Basics - Anfänger-Themen 2
S Collections funktionale Listen (ListNode<E>) review und problem beim clone Java Basics - Anfänger-Themen 0
W OOP Vererbung und Problem bei Zählschleife in einer Methode Java Basics - Anfänger-Themen 10
C Problem mit If Else If und Überprüfung eines Counters Java Basics - Anfänger-Themen 3
F Problem mit Listen Java Basics - Anfänger-Themen 5
I wieder mit einer Umwandelung habe ich Problem (diesmal von char Array zu char) Java Basics - Anfänger-Themen 1
J Problem bei Umrechnung von Hex in Bin Java Basics - Anfänger-Themen 4
W Problem bei Programmierung von Monte-Carlo-Integration Java Basics - Anfänger-Themen 12

Ähnliche Java Themen

Neue Themen


Oben