Reflection - wie anwenden/benutzen bei folgendem Problem

Status
Nicht offen für weitere Antworten.

y0dA

Top Contributor
Hi!
Also ich habe eine Klasse OfflineProcessor, von jener sind folgende 2 Klassen eine Spezialisierung: FileSystemProcessor und DatabaseProccesor. Die beiden Spezialisierungen wiederum besitzen eine Klassenvariable welche ein Interface (ITrackParser) implementieren sollte.

Also grafisch ungefähr so:

OfflineProcessor
^ ^
| |
FileSystemProcessor DatabaseProcessor
| |
use use
| |
ITrackParser ITrackParser <-------NMEAParser (Beispiel Implementation)


Nun liegt mein Problem darin dass es möglich sein sollte dass man die Klasse welche ITrackParser implementiert auch von dritten implementiert werden können. Nun brauche ich irgendeine Möglichkeit dass, wenn ich der Klasse OfflineProcessor den Pfad zum JAR File der Implementation zu ITrackParser angebe, dass ich dann jenen Parser in FileSystemProcessor benutze.

Kann mir hier jemand weiterhelfen bzw. ist es überhaupt möglich zur Laufzeit externe JARS zu benutzen?

OfflineProcessor:
Code:
public class OfflineProcessor {
	/**
	 * implementing class name
	 * must implement interface
	 * @see {@link org.pcd.wam.gegenstandsbereich.streetDetection.locating.parser.ITrackParser}
	 */
	private String className;
	
	/**
	 * path to jar libary path which contains <code>{@link #className}</code>
	 * if <code>{@link #className}</code> is already implemented, value is null
	 */
	private String libPath;
	
	/** */
	private String name;
	
	/**
	 * empty constructor
	 */
	public OfflineProcessor() {
		// nothing to do
	}

	/**
	 * getter method
	 * dynamically instantiate a certain processor class
	 * @return processor class
	 */
	protected ITrackParser getTrackInterface() {
		//FIXME wie implementieren?
		return null;
	}
	
	/**
	 * process <code>track</code>
	 * @param track track
	 */
	protected void processTrack(final Track track) {
	}
}

FileSystemProcessor:
Code:
public class FileSystemProcessor extends OfflineProcessor {
	
	/** file path */
	private String filePath;

	/**
	 * ??
	 * get closed files with a length greater than 0
	 * @return list of file names
	 */
	public List<String> getFiles() {
		return null;
	}
}

ITrackParser:
Code:
public interface ITrackParser {
	/**
	 * returns all tracks depending on parameter <code>fileName</code>
	 * @param s file path name or a jdbc connection string
	 * @return tracks
	 */
	public List<Track> getTracks(final String s);
	/**
	 * returns a device id which corresponds with already definded devices
	 * if not available return null
	 * @return receiver id
	 */
	public String getReceiverId();
}
mfg
 

quippy

Bekanntes Mitglied
Wenn ich Dich richtig verstanden habe, dann läuft das Ganze auf eine Factory hinaus. Also sowas wie bei den JDBC-Treibern für verschiedene Datenbanken.

Drittanbieter für Dein Interface müssen dann aber dafür sorgen, daß Deine Factory für das Interface sie kennt, als eine Anmeldung durchführen.

Das geht recht einfach, in dem man in der Implementierung einen static-Block in den Kopf der Klasse packt, etwas in der Art:
Code:
public class MyImpl implements ITrackParser
{
   static
   {
      YourFactory.register(MyImpl.class);
      // oder
      // YourFactory.register(new MyImpl());
   }
...
}

Dann würde ein "Class.forName("MyImpl");" ausreichen und deine Factory kennt diese Impl.

Deine Factory wäre eine Containerklasse mit Methoden "register" und "getInstance" wobei bei "getInstance" ein Entscheidungsgrund mitgegeben werden muss, warum welche Impl gezogen werden soll.
Vielleicht hat der Parser einen Namen oder so, dann kann man das angeben.

z.B. "getInstance("default");" für die Default-Impl und "getInstance("MySuperParser");" für den anderen.

Wenn Du einen vollautomatischen PlugIn-Mechanismus haben willst (also einfach ein Jar in einem Verzeichnis ablegen), wird's allerdings schwieriger, denn dann mußtest Du alle Jars diesem PlugIn-Verzeichnis öffnen (geht mit ZipInputStream) und alle Classes, die da drin sind, einmal laden. Denn erst nach dem Laden weißt Du, welche Interfaces sie implementieren - nach oben beschriebener Technik wären Sie dann aber auch schon automatisch angemeldet.

Alternativ könnte man aber auch eine properties-Datei pflegen, in welche man die zu ladenden Klassen eintragen muss.
 

quippy

Bekanntes Mitglied
SlaterB hat gesagt.:
hab mal was zum 'Jar nachladen' bei google gefunden, weiß dazu aber nix
http://www.tutorials.de/forum/java/245982-jar-file-nachladen.html

Die im Link vorgestellte Taktik ist unglücklich, denn sie verwendet eine Methode "addURL", welche private ist, und bedient sich "schmutziger" (;)) Reflection-Tricks, um sie dennoch zu verwenden. D.h. in zukünftigen Versionen des ClassLoaders könnte sie sang- und klanglos verschwinden oder umbenannt werden - da sie private (oder protected?) ist, muss man annehmen, daß das ohne "@deprecated" erledigt würde.

Auch wenn es nicht so einfach ist: für das dynamische Nachladen von JARs würde ich eher einen neuen ClassLoader schreiben, der das beherrscht und dann damit arbeiten - das ist sauberer.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Reflection gone wrong? Allgemeine Java-Themen 21
B Java Reflection Probleme beim wehcselseitigen Referenzieren zweier Klassen/Objekte Allgemeine Java-Themen 14
J Reflection Aufruf: .class durch .dll ersetzen Allgemeine Java-Themen 4
T Reflection - Abprüfen von Klasseneigenschaften Allgemeine Java-Themen 3
perlenfischer1984 Reflection : Element in generische Liste hinzufügen Allgemeine Java-Themen 4
J Reflection-Method Hook? Allgemeine Java-Themen 14
J Reflection mit Klasse und Subklasse Allgemeine Java-Themen 11
X public Getter ersetzen (Reflection?!) Allgemeine Java-Themen 3
A Reflection Problem Allgemeine Java-Themen 15
K Generic class und Reflection Allgemeine Java-Themen 2
G SecurityManager/Policy-File/Reflection Allgemeine Java-Themen 0
N Per Reflection auf (method) local inner class zugreifen? Allgemeine Java-Themen 3
E Reflection? Frage Allgemeine Java-Themen 4
B Reflection, invoke dynamisch befüllen Allgemeine Java-Themen 3
T Reflection Allgemeine Java-Themen 11
G Klassen Cast auf Argumentenklasse via Reflection? Allgemeine Java-Themen 10
H Collections Generics und Reflection Allgemeine Java-Themen 6
TheWhiteShadow Reflection-Lösung für Objektkopien Allgemeine Java-Themen 3
B Reflection: getMethods schlägt fehl (NoClassDefFoundE)) Allgemeine Java-Themen 15
P Reflection "Cast" Allgemeine Java-Themen 5
D Reflection-Performance Allgemeine Java-Themen 7
S Reflection und Generic Allgemeine Java-Themen 9
W Reflection -> getMethod bei optionalen Parametern Allgemeine Java-Themen 4
Kr0e Reflection - Instanz einer Klasse erstellen, ohne Default-Constructor Allgemeine Java-Themen 15
C Probleme mit dem Zugriff auf private Methode per reflection Allgemeine Java-Themen 2
C Zugriff auf private Methode per reflection geht nicht mehr Allgemeine Java-Themen 3
M Probleme mit Reflection Allgemeine Java-Themen 10
A Reflection Konstruktor Parameter Supertyp Allgemeine Java-Themen 2
D Vererbung, Reflection und automatischer Methodenaufruf Allgemeine Java-Themen 24
G Java Reflection Allgemeine Java-Themen 11
N Reflection: NoSuchMethodException obwohl Methode existiert Allgemeine Java-Themen 2
brunothg Problem mit Reflection Allgemeine Java-Themen 6
M reflection in inner classes Allgemeine Java-Themen 7
T Class-files zur Laufzeit zu Reflection-Zwecken laden Allgemeine Java-Themen 18
V Reflection - Field-Instanz und Annotations Allgemeine Java-Themen 6
Y Reflection und "extends" Schlüsselwort Allgemeine Java-Themen 3
R Reflection Problem Allgemeine Java-Themen 4
N getName() of reflection Object Allgemeine Java-Themen 4
P Reflection - Wie rufe ich die Felder einer Klasse in einer Methode der Basisklasse? Allgemeine Java-Themen 4
M Reflection Queue auslesen Allgemeine Java-Themen 6
N generic reflection Allgemeine Java-Themen 5
megachucky Java Reflection -> versteckte Felder finden? Allgemeine Java-Themen 3
MQue Reflection Exception Allgemeine Java-Themen 11
R Problem mit Reflection und Generics Allgemeine Java-Themen 3
ruutaiokwu Per Reflection membervariablen überschreiben / zuweisen / nullen Allgemeine Java-Themen 5
T Zugriff per Reflection o.ä. möglich? Allgemeine Java-Themen 18
R Reflection: Membervariablen-Initialwerte Allgemeine Java-Themen 4
G Reflection Allgemeine Java-Themen 6
V reflection in java 5 und 6 Allgemeine Java-Themen 2
C Reflection Übergabeparamter überprüfen? Allgemeine Java-Themen 3
Ark Konstruktor per Reflection nicht bekannt Allgemeine Java-Themen 4
Q Objekte durch Reflection erzeugen Allgemeine Java-Themen 18
G [Reflection + WebService] Methodenaufruf an einem Proxy Allgemeine Java-Themen 11
T Parameternamen mit Reflection-API Allgemeine Java-Themen 14
M reflection mit parametern Allgemeine Java-Themen 8
M Reflection Frage Allgemeine Java-Themen 7
G Code vereinfachen bei Reflection Allgemeine Java-Themen 4
I reflection get inner static classes Allgemeine Java-Themen 2
C Reflection Allgemeine Java-Themen 12
Y Reflection - wie kann ich eine Methode benutzen Allgemeine Java-Themen 4
P Java Reflection API - ResultDataModel ? Allgemeine Java-Themen 3
R Object Dynamisch erzeugen (Reflection API) Allgemeine Java-Themen 22
N Design-Frage: persistent machen per Reflection Allgemeine Java-Themen 3
G Reflection: aktuelle bzw umschliessende Methode? Allgemeine Java-Themen 7
G per Reflection auf private Klassenattribute zugreifen? Allgemeine Java-Themen 9
G Reflection objekt mit generics erzeugen Allgemeine Java-Themen 5
M per reflection private attributsnamen auslesen Allgemeine Java-Themen 3
G Interface - Klassen implementieren das - Reflection ok? Allgemeine Java-Themen 4
C Reflection Problem! Allgemeine Java-Themen 2
G Object cast via Reflection Allgemeine Java-Themen 8
T Reflection und Typsicherheit Allgemeine Java-Themen 5
Q Umgang mit Reflection Allgemeine Java-Themen 4
S reflection Allgemeine Java-Themen 12
X Reflection performant? Allgemeine Java-Themen 11
M Reflection und Serializable Allgemeine Java-Themen 5
A Reflection - Variablen innerhalb einer Methode ermitteln Allgemeine Java-Themen 9
F Performance von Reflection vs Statisches Coden Allgemeine Java-Themen 4
the[V]oid Primitive Arrays per Reflection erzeugen? Allgemeine Java-Themen 2
W Package via Reflection parsen Allgemeine Java-Themen 4
R Interface mittels Reflection implementieren Allgemeine Java-Themen 8
M reflection Integer != int ? Allgemeine Java-Themen 3
M reflection invoce Allgemeine Java-Themen 3
K Reflection:Zugriff auf innere Klassen Allgemeine Java-Themen 4
N NoSuchMethodException bei Reflection-Versuch, aber warum? Allgemeine Java-Themen 3
byte Methodenaufruf per Reflection? Allgemeine Java-Themen 2
M Generics und Reflection Allgemeine Java-Themen 3
M Array per Reflection manipulieren Allgemeine Java-Themen 5
M Klassen von ausserhalb des Jars per Reflection nachladen Allgemeine Java-Themen 2
thE_29 Reflection Allgemeine Java-Themen 6
M statische Methode per reflection aufrufen Allgemeine Java-Themen 2
B Frage zu Reflection Allgemeine Java-Themen 3
V Reflection - Problem Allgemeine Java-Themen 3
clemson Reflection Interface Allgemeine Java-Themen 4
G mit reflection an die felder einer klasse rankommen Allgemeine Java-Themen 4
N Reflection: An Package einer .class-Datei kommen Allgemeine Java-Themen 2
N Reflection: Feststellen ob eine Klasse abstract ist Allgemeine Java-Themen 3
B Reflection Allgemeine Java-Themen 10
C Reflection und variable casten ! Allgemeine Java-Themen 10
C Reflection - Kurze Beschreibung? Allgemeine Java-Themen 3
F Frage zum Thema Reflection Allgemeine Java-Themen 13

Ähnliche Java Themen

Neue Themen


Oben