Generics und instanceof

Status
Nicht offen für weitere Antworten.

The_S

Top Contributor
Hi,

ich habe eine generische Klasse

Code:
public class MyClass<Cls> {
...
}

in dieser Klasse lade ich jetzt über den ClassLoader dynamisch andere Klassen in einer Methode. Diese Methode soll ein true zurückliefern, wenn die dynamisch geladene Klasse vom Typ des Generics ist (bzw. diesen implementiert oder davon erbt). Nur weiß ich nicht, wie ich jetzt überprüfe, ob jetzt genau dieses Zutrifft. Verkürzt sieht das Ganze so aus:

Code:
	public boolean isInstance(String cls, ClassLoader cl) throws 	ClassNotFoundException, 
																						ClassCastException,
																						InstantiationException,
																						IllegalAccessException {
		Class c = cl.loadClass(cls);
		if (c instanceof Cls) {
			return true;
		}
		return false;
	}

Nur funktioniert hier instanceof natürlich nicht. Weiß jemand, wie das richtig gemacht wird? Kann ja nicht so schwer sein ...

Danke!
 

The_S

Top Contributor
Cls cannot be resolved (warum auch immer)!? Bin leider vollkommen neu in der Welt der ClassLoader und Reflection :cry: .
 

HoaX

Top Contributor
die generics fliegen beim kompilieren raus. du kannst also zur laufzeit nicht den typ vergleichen. bleibt dir ein objekt oder die klasse direkt als parameter zu übergeben
 

The_S

Top Contributor
öhm, anstelle von Generics ein Objekt, oder anstelle von loadClass ein Objekt bzw. eine Klasse übergeben!?
 
S

SlaterB

Gast
anstelle von Generics ein Objekt,
dein Problem ist, dass die Information über den generischen Typ zur Laufzeit nicht mehr vorhanden ist
 

The_S

Top Contributor
Richtig, aber ich kann doch einen anderen Programmierer, der meine kleine Klasse verwendet, nicht ernsthaft zumuten, dass er ein Objekt erstellt und mir übergibt. Mal ganz davon abgesehen, dass dann Methoden mit dem Rückgabewert des generischen Typs nicht mehr möglich währen.
 
S

SlaterB

Gast
> dass dann Methoden mit dem Rückgabewert des generischen Typs nicht mehr möglich währen

wieso? der generische Parameter und alles bleibt wie es ist,
nur zusätzlich noch das Objekt ("anstelle von Generics" ist nicht wörtlich gemeint, war eh deine Formulierung ;) )

ob du dies jemanden zumuten kannst und/ oder willst, ist eine Frage für sich,
ohne wird jedenfalls die Funktionalität nicht gehen
(nach dem bisherigen Wissensstand in diesem Topic)
 

The_S

Top Contributor
Hm, ich hab jetzt noch etwas gebaut. Dabei muss nur die Klasse und kein Objekt übergeben werden (was in meinen Augen zumutbar ist). Aber da ich wie gesagt in dem Gebiet recht unerfahren bin, würde ich mich freuen, wenn da noch jemand drüber schaut, der sich damit auskennt (ein erster Test lief bei mir erfolgreich):

Code:
public class PluginLoader<Cls> {

	private Class gener = null;
	
	public PluginLoader(Class gener) {
		this.gener = gener;
	}

	public boolean isInstance(String cls, ClassLoader cl) throws 	ClassNotFoundException, 
															ClassCastException,
															InstantiationException,
															IllegalAccessException {
		Class c = cl.loadClass(cls);
		Class[] ifaces = c.getInterfaces();
		if (isSubclass(c)) {
			return true;
		}
		for (int i = 0; i < ifaces.length; i++) {
			if (ifaces[i] == gener) {
				return true;
			}
		}
		return false;
	}
	
	public boolean isSubclass(Class c) {
		
		if (c == gener) {
			return true;
		}
		Class cl = c.getSuperclass();
		if (cl == null) {
			return false;
		}
		return isSubclass(cl);
	}
}
 
S

SlaterB

Gast
die übergebene Klasse kannst du noch typisieren,
unabhängig von dem verwendeten ClassLoader möchtest du vielleicht das bereits erwähnte isAssignableFrom() verwenden:
Code:
public class Test
{

    public static void main(String[] args)
        throws Exception
    {
        PluginLoader p = new PluginLoader<Number>(Number.class);
        System.out.println(p.isInstance(String.class.getName()));
        System.out.println(p.isInstance(Number.class.getName()));
        System.out.println(p.isInstance(Integer.class.getName()));
    }
}


class PluginLoader<Cls>
{

    private Class<Cls> gener = null;

    public PluginLoader(Class<Cls> gener)
    {
        this.gener = gener;
    }

    public boolean isInstance(String cls)
        throws Exception
    {
        Class c = Class.forName(cls);
        return gener.isAssignableFrom(c);
    }
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Best Practice Generics mit Enum Allgemeine Java-Themen 3
H Kombination Interface und Abstrakte Klasse bei Generics Allgemeine Java-Themen 3
Zeppi Cast Object in Generics Allgemeine Java-Themen 4
P Generics und Arrays Allgemeine Java-Themen 6
M Generics / Typen Allgemeine Java-Themen 1
Kirby.exe InsertionSort mit Generics Allgemeine Java-Themen 33
Kirby.exe Vererbung bei Generics Allgemeine Java-Themen 7
H Klarnamen etc... (von Wie Generics lernen?) Allgemeine Java-Themen 26
D Wie Generics lernen? Allgemeine Java-Themen 26
L Compiler-Fehler Generics beim Anhängen von Predicates Allgemeine Java-Themen 1
W Vererbung Generics - mal wieder die verhaßte Rückwärtskompatibilität Allgemeine Java-Themen 2
S Verstaendnisfrage Generics Allgemeine Java-Themen 19
W Generics + Vererbung Allgemeine Java-Themen 47
I Methoden Generics-Methode Allgemeine Java-Themen 3
D Mit Generics arbeiten - Übungsaufgabe Allgemeine Java-Themen 3
K Factory Pattern: Mit Generics umgehen Allgemeine Java-Themen 6
G Generics Allgemeine Java-Themen 31
perlenfischer1984 Liste mit generics zurück liefern Allgemeine Java-Themen 8
Hacer Generics & Collections Allgemeine Java-Themen 8
Neumi5694 Interface Generics für Enum-Filterung verwenden Allgemeine Java-Themen 5
H Collector Generics Problem (incl. Stream & Lambda) Allgemeine Java-Themen 4
C Gemeinsame Oberklasse zweier Generics Allgemeine Java-Themen 10
erdmann Datentypen Methodendeklaration mit Generics Allgemeine Java-Themen 2
Z Datentypen Verschachtelte Generics Allgemeine Java-Themen 1
Neumi5694 Datentypen Generics Allgemeine Java-Themen 5
S Mit Generics Klasse erstellen die selbst T erweitert..? Allgemeine Java-Themen 4
Tarrew Generics - Type erasure Allgemeine Java-Themen 5
N Problem mit Generics und Interface Allgemeine Java-Themen 4
H Generics als Parameter Allgemeine Java-Themen 1
kaoZ Generics und Vererbung Allgemeine Java-Themen 3
A Datentypen Generics: Wie am besten auf Typparameter zugreifen Allgemeine Java-Themen 2
C Generics Objekt in ArrayList Allgemeine Java-Themen 2
vandread Kleine Generics Aufgabe aus einer Prüfung... wie ist das gemeint? Allgemeine Java-Themen 6
G Generics sind zu streng - oder ich zu naiv? Allgemeine Java-Themen 3
G Verschachtelte Generics Allgemeine Java-Themen 2
O Generics Allgemeine Java-Themen 42
M Problem mit Generics Allgemeine Java-Themen 10
M Generics (bounded wildcards statt Interface Bezeichnern) -- Sinn oder Unsinn? Allgemeine Java-Themen 2
darekkay Generics: Wildcard und Object Allgemeine Java-Themen 5
H Collections Generics und Reflection Allgemeine Java-Themen 6
F Google Guice + Generics + Vererbung Allgemeine Java-Themen 5
H Problem mit Java Generics Allgemeine Java-Themen 6
J Generics: Typparameter als Klasse zurückliefern Allgemeine Java-Themen 4
H Generics Allgemeine Java-Themen 5
P Probleme mit Generics Allgemeine Java-Themen 5
B Generics und primitve arrays Allgemeine Java-Themen 6
M Generics Allgemeine Java-Themen 11
1 Collections Generics, internes Verhalten Allgemeine Java-Themen 16
T Warnungsfreie Verwendung von Generics Allgemeine Java-Themen 11
M Probleme mit Generics Allgemeine Java-Themen 5
D Java Generics Allgemeine Java-Themen 8
2 Generics: bounded wildcards Allgemeine Java-Themen 4
J Generics / vermeiden von downcasts Allgemeine Java-Themen 2
2 Generics oder nicht? Allgemeine Java-Themen 8
E Problem mit Generics und Comparable Allgemeine Java-Themen 16
W Erweitern einer Klasse mit Generics Allgemeine Java-Themen 8
H Generics für Methode Allgemeine Java-Themen 14
N Überladen mit Hilfe von Generics Allgemeine Java-Themen 3
S Generics: Fuer Set<T> ein T-Klassenobjekt erhalten? Allgemeine Java-Themen 3
Q Der innere Typ von Generics? Allgemeine Java-Themen 3
N Generics-NullpointerException Allgemeine Java-Themen 7
2 Generics - Typ Allgemeine Java-Themen 12
P Generics Problem Allgemeine Java-Themen 10
S Type safety Warnings beim casten von Generics Allgemeine Java-Themen 6
N Generics Allgemeine Java-Themen 3
V Frage zu Generics Allgemeine Java-Themen 2
S java generics klassen deklaration Allgemeine Java-Themen 7
B hashtable für unterschiedliche Typen - mit Generics Allgemeine Java-Themen 8
E Generics Allgemeine Java-Themen 3
MQue Generics Allgemeine Java-Themen 4
R Problem mit Reflection und Generics Allgemeine Java-Themen 3
C Klassen, die aufeinander verweisen (mit Generics) Allgemeine Java-Themen 16
G Generics - W.card unter Nutzung von Annotationsklasse? Allgemeine Java-Themen 6
G sortieren von generics Allgemeine Java-Themen 10
G Generics in Map. Type of value abhängig vom key Allgemeine Java-Themen 3
A Generics Verständnisfrage Allgemeine Java-Themen 7
Z Generics funzt nicht? Allgemeine Java-Themen 2
T Generics Allgemeine Java-Themen 18
G ComboBox: Nur eine Art Klasse zulassen (Generics) Allgemeine Java-Themen 3
J Generics Expertenwissen? Allgemeine Java-Themen 5
S Generics-Problem Allgemeine Java-Themen 3
T Generics und Wil-dcards Allgemeine Java-Themen 8
Q Typen von Generics & Casten Allgemeine Java-Themen 3
S Generics Allgemeine Java-Themen 2
R Problem mit Generics Allgemeine Java-Themen 2
G Trotz Generics Cast-Fehler! Allgemeine Java-Themen 5
T TreeMap durch Comparator mit Generics sortieren Allgemeine Java-Themen 9
T Generics und Exceptions Allgemeine Java-Themen 6
M Beliebig viele Typen bei Generics Allgemeine Java-Themen 3
G Reflection objekt mit generics erzeugen Allgemeine Java-Themen 5
S Singleton Pattern mit Generics Allgemeine Java-Themen 4
G Generics und Comparable Allgemeine Java-Themen 11
H Generics Problem Allgemeine Java-Themen 3
F Generics: spricht etwas dagegen raw types zu verwenden? Allgemeine Java-Themen 31
M Generics - besser programmieren, Warnung umgehen Allgemeine Java-Themen 4
E Java, UML, Generics Allgemeine Java-Themen 6
P Array von Vectoren + Generics Allgemeine Java-Themen 6
M ArrayList erweitern - generics Allgemeine Java-Themen 4
E Generics -> UML Allgemeine Java-Themen 4
G Generics: Instanzieren einer Klasse in einer Methode. Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben