PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [JAVA] Problem mit Dyn. Klassennamen



ExeCRabLE
24-10-2003, 15:18
Hallo zusammen !

Ich erhalte aus der Datenbank einen Klassennamen, den ich dann aufrufen möchte. Wie geht das ?

Ich habe Vergleichswerte die in der Datenbank liegen. Nach einem Select auf die Datenbank bekomme ich einen Rückgabewert, der zugleich ein Klassename ist z.B. "Drucker.class".

Nun möchte ich die Klasse "Drucker.class" mit einer Methode z.B. "getdata" aufrufen.

Ich habe schon mit Call.forName usw. experementiert, doch ich bin keinen deu weitergekommen.

Kennt ihr eine Lösung ?

cu
ExeCRabLE

bischi
24-10-2003, 16:07
Du könntest beispielsweise ne verzweigte if-else Anweisung machen (falls nicht allzu viele Klassen beteiligt sind).

Ne andere Lösung gibt es meines Wissens nicht.

MfG Bischi

peschmae
24-10-2003, 17:06
meinst du "Class.forName()"?

Du musst wohl das .class bei dem String vorher wegschneiden.

Falls die Klasse in einer Package ist, musst du die wohl auch angeben. (z.B. org.eclipse.swt.etc.wasauchimmer.MyClass)

Vielleicht solltest du auch mal "ClassLoader.loadClass(String name)" probieren.

MfG Peschmä

anda_skoa
24-10-2003, 17:15
Class.forName ist eigentlich ziemlich einfach.

In unserem letzen Java vs. C++ Flamewar im Forum Mitgliederbereich gibts ein kleines Beispiel von mir, dass das benutzt.
Edit: auf dieser Seite, weit unten http://www.mrunix.de/forums/showthread.php?s=&threadid=33278&perpage=15&pagenumber=2

Wenn du den Methodennamen auch nur als String hast, musst du dir zusätzlich Class.getMethod ansehen, außer es gibt nur eine feste Menge an Methoden, dann kann man auch mit if, else if arbeiten.

Ciao,
_

ExeCRabLE
24-10-2003, 18:51
Hi,

danke schon mal für eure Antworten...

Eine if-else Anweisung würde ich momentan nicht für sinnvoll halten aber ich kann mich auch irren.

Ich versuche euch kurz die Situation etwas genauer beschreiben.

Ich möchte mit meinem Programm Datenströme im Spool filtern. Der Datenstrom wird per Argument übergeben (Filterübergabe), eine Zeichenkette wird an fester Stelle im Datenstrom ausgelesen und in der Datenbank in einer Tabelle verglichen. Nach dem Vergeich wird ein Wert von der Datenbank zurück gegeben. Der Wert ist gleich ein Klassenname, der zur weiteren Analyse des Datenstroms benötigt wird.

Jede Klasse hat die gleichen Methodenaufrufe z.B. getformname oder getuser, also sollte der Aufruf "eigentlich" nicht so schwierig sein ?!

Ich habe bis jetzt mit Class.forName rumgebastelt.





...
try{
//Datenbank-Connect
Class.forName("com.sap.dbtech.jdbc.DriverSapDB").newInstance();
Connection cn =
DriverManager.getConnection("jdbc:"+dbtype+"://"
+dbhost+"/"+dbname+"?user="+dbuser+"&password="+dbpass);
Statement st = cn.createStatement();


// Klasse herausfinden
try{
ResultSet wert = st.executeQuery("select CLASS from
FILE_ID where STRING='"+merkmal+"'");
while (wert.next()) {
klassen = wert.getString("CLASS");
}
wert.close();

try{
Class c= Class.forName("de.cais.format."+klasse);
...

...
}catch (Exception e2){System.out.println("Klasse nicht
gefunden");System.exit(1);}

}catch (Exception e2){System.out.println("Es wurde kein
eindeutiges Merkmal gefunden!");System.exit(1);}


// DB-Exit
st.close();
cn.close();
}
catch(Exception e){System.out.println("DB Zugriff nicht
möglich");System.exit(1);}

String abc="Derzeit kein Rückgabewert";
return abc;
....


@ anda_skoa:
Ich habe mir dein Proggi angeschaut, bei deinem Proggi kennst du die Klasse und schreibst sie mit "Plugin p = ..." fest rein. Das kann ich nicht.

Ich weis eigentlich nicht welche Klassen existieren nur die Datenbank weis es.
Aufgrund der Wertwiedergabe der Datenbank, weis ich welche Klasse ausgeführt werden soll.

Damit kann ich insgesamt sehr einfach die Analyse durch unabhängige Klassen steuern und sehr einfach erweitern, in den ich eine neue Klasse in den Programmpfad oder .jar kopiere und die Datenbanktabelle mit der neuen Klasse fütter.


üffs ... ;)

cu
ExeCRabLE

anda_skoa
25-10-2003, 11:37
Original geschrieben von ExeCRabLE
@ anda_skoa:
Ich habe mir dein Proggi angeschaut, bei deinem Proggi kennst du die Klasse und schreibst sie mit "Plugin p = ..." fest rein. Das kann ich nicht.

Nein, ich kenne die Klassen genau so wenig.
Ich kenne nur das gemeinsame Interface, also welche Methoden in allen Klassen vorhanden sind.

Scheint ja auch bei dir der Fall zu sein. Es müssen nur die gemeinsamen Methoden in einem Interface spezifiziert werden und dass benutzt man dann im Hauptprogramm als Anhaltspunkt.



Ich weis eigentlich nicht welche Klassen existieren nur die Datenbank weis es.
Aufgrund der Wertwiedergabe der Datenbank, weis ich welche Klasse ausgeführt werden soll.


Du brauchst auch die Klasse selbst nicht zu kennen.
In einem Uniprojekt hab ich Klassen geladen und benutzt, die in einer Textdatei angegeben waren, also praktisch die selbe Sache.
Wenn man immer nur die selben Methoden aufrufen muss, können die in einem Interface spezifiziert werden, die alle Klassen implementieren.
Für das verwendende Programm ist nur dieses Interface wichtig.

Ciao,
_

ExeCRabLE
25-10-2003, 12:38
@anda_skoa:
Erst einmal Danke !!
Ok, jetzt habe ich es verstanden:) Ich habe das Interface implementiert und zumindestens der Aufruf funktioniert jetzt.

Ich habe nur eine Frage... wenn ich eine Methode "getname" in meiner externen Klasse habe, wie kann ich einen Returnwert wiedergeben? Die externe Klasse koppt sich mit dem Interface...


//Main
try{
Class c = Class.forName(klassen_id);
extjava ext = (extjava) c.newInstance();
String test=ext.getformname();
System.out.println(test);
}
catch (ClassNotFoundException ex) {
System.err.println("Class "+klassen_id+"
not found in classpath.");
}


interface extjava
{
public String getformname();

}


//externe Klasse
public class GET_RDI implements extjava {

public String getformname(){
String a="teddy";
return a;
}
}

Wie funktioniert die Übergabe und die Entgegennahme von Werten zwischen den einzelnen Klassen ? Die Abhängigkeiten sind etwas verwirrend :D

cu
ExeCRabLE

anda_skoa
25-10-2003, 12:50
Ich hab das jetzt nicht ganz verstanden. :confused:

Bis auf die Erzeugung ist die Handhabung völlig gleich wie immer in Java.

Nach newInstance() ist das Objekt ganz normal, so wie wenn du es mit new erzeugst.

Btw,
return "teddy";
reicht :)

Ciao,
_

ExeCRabLE
25-10-2003, 13:02
*g*

Ich habe wohl eben vergessen eine der beiden beteidigten zu compilieren :)
Daher bekam ich ständig ein Fehlermeldung, da die Typen nicht kompatibel seien.

Wie auch immer, der Aufruf funktioniert prächtig ! Ich bin begeister. Insgesamt habe ich gestern ganz 13 Stunden an dem Problem gesessen und mich völlig verdenkt. Heute nach der ersten Kannekaffe scheint alles sooo einfach :D

Danke dir anda_skoa, ich habe damit den scheinbar schwierigesten Punkt schon einmal überwunden *freu*

cu
ExeCRabLE

peschmae
25-10-2003, 13:25
Original geschrieben von ExeCRabLE
Wie auch immer, der Aufruf funktioniert prächtig ! Ich bin begeister. Insgesamt habe ich gestern ganz 13 Stunden an dem Problem gesessen und mich völlig verdenkt. Heute nach der ersten Kannekaffe scheint alles sooo einfach :D


Jaja, so gehts leider immer :(

Deshalb lasse ich Probleme meist auch ein bisschen liegen und finde dann einfach plötzlich: Heute mach ich das...



Danke dir anda_skoa, ich habe damit den scheinbar schwierigesten Punkt schon einmal überwunden *freu*


Jaja, so gehts auch immer :D

MfG Peschmä