Anzeige:
Ergebnis 1 bis 10 von 10

Thema: [JAVA] Problem mit Dyn. Klassennamen

  1. #1
    Registrierter Benutzer
    Registriert seit
    06.06.2003
    Ort
    Köln
    Beiträge
    52

    Unhappy [JAVA] Problem mit Dyn. Klassennamen

    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
    Unwissenheit ist Staerke

  2. #2
    Registrierter Benutzer Avatar von bischi
    Registriert seit
    10.04.2003
    Beiträge
    4.828
    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

    "There is an art, it says, or rather, a knack to flying. The knack lies in learning how to throw yourself at the ground and miss it" The hitchhiker's guide to the galaxy by Douglas Adams

    --> l2picfaq.pdf <-- www.n.ethz.ch/~dominikb/index.html LaTeX-Tutorial, LaTeX-Links, Java-Links,...

  3. #3
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    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ä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  4. #4
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    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/showthre...5&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,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  5. #5
    Registrierter Benutzer
    Registriert seit
    06.06.2003
    Ort
    Köln
    Beiträge
    52
    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.




    Code:
     ...
    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
    Geändert von ExeCRabLE (24-10-2003 um 18:56 Uhr)
    Unwissenheit ist Staerke

  6. #6
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    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,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  7. #7
    Registrierter Benutzer
    Registriert seit
    06.06.2003
    Ort
    Köln
    Beiträge
    52
    @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...

    Code:
    //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.");
        }
    Code:
    interface extjava
    {
    	public String getformname();
    	
    }
    Code:
    //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

    cu
    ExeCRabLE
    Unwissenheit ist Staerke

  8. #8
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Ich hab das jetzt nicht ganz verstanden.

    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,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  9. #9
    Registrierter Benutzer
    Registriert seit
    06.06.2003
    Ort
    Köln
    Beiträge
    52
    *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

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

    cu
    ExeCRabLE
    Unwissenheit ist Staerke

  10. #10
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    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
    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

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •