java-forum.org - Java programmieren aus Leidenschaft
Java 6 Einstieg und professioneller Einsatz
Alter Preis: 34,90 EUR
Jetzt: 0,00 EUR

zzgl. Versandkosten

Zurück   java-forum.org - Java programmieren aus Leidenschaft > Java - Programmierung > Allgemeine Java-Themen

Allgemeine Java-Themen Allgemeine Themen, die nicht in andere Fachforen und nicht zu den Java Basics passen

Thema geschlossen    
Themen-Optionen Thema durchsuchen Ansicht
Alt 08.01.2008, 10:40   #1 (permalink)
Stammbenutzer
Halbes Megabyte
 
Registriert seit: 03.01.2008
Fachbeiträge: 623
Abgegebene Danke: 15
Erhielt 5 Danke für 5 Beiträge
Standard "Exzessiv" dynamisches generieren

wusste nicht wie ich das sonst nennen soll...
habe eine template klasse wo einfach ein array von objekten drin ist... und diverse funktonen definiert sind, die die liste handeln

Code:
public class ClassTemplate {
	private Object[] data
	...
}
lade dann aus einer datenbank eine tabelle
dabei lese ich

1) namen aus (string[])
2) datentypen aus (String[])
3) daten aus verschiedensten typen

nach bearbeitung habe ich folgendes:
1) namen aus [columnNames] (string[])
2) datentypen [columnDataTypes] aus (Class[])
3) daten [daten aus dem ResultSet] aus verschiedensten typen als Object array[]


dazu habe ich mir schon eine klasse geschrieben, die die datentypen in classes umwandelt
also der string "text" aus sql liefert mir die klasse java.lang.String zurück.

Code:
public class DataTypeMapper {
	...
	public static Class getType(final String dataType) {
	   return typeMap.get(dataType);
	}
	...
}
wenn ich mir alles in die cmd ausgeben lasse, kommt schon alles korrekt zurück...

Code:
	// i is der index einer for-schleife, die mir alle result-zeilen durchgeht
	System.out.println("("+i+")"+this.columnNames[i]+" has type "
		+db.DataTypeMapper.getType(this.columnDataTypes[i])
		+" filled with data: ["+rs.getObject(this.columnNames[i]+"]");
mein problem ist nun...
wie kann ich dynamisch ein objekt vom typ xy generieren, ohne vorher zu wissen was xy ist?
so hab ichs versucht, klappt aber nicht

Code:
	Object value = rs.getObject(this.columnNames[i]);
	Object type = db.DataTypeMapper.getType(this.columnDataTypes[i]);
	type variable = new type(value);
wozu ich das machen will?
somit könnte ich ALLE meine tabellen mit einer funktion schon korrekt laden lassen und müsste nur noch die generierte klasse an die funktion übergeben, ohne für 101 Tabellen (so viele sinds in meinem fall) eigene Klassen zu schreiben... (würde mir somit ne menge arbeit sparen)
lumo ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 08.01.2008, 11:19   #2 (permalink)
Neuer Benutzer
byte
 
Registriert seit: 06.01.2008
Fachbeiträge: 13
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
Die Lösung sollten in deinem Fall Generics sein.
Hier mal ein Beispiel:
Code:
public class genericArray<T> {
   private T[] data;
   ...
}
wenn du dann ein generisches Objekt anlegst einfach:
Code:
 genericArray bsp = new genericArray<String>();
Wenns das in deinen Code einbaust, solltes du dein Ziel erreichen.
Wenn nicht einfach wieder melden.
mhauert ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 08.01.2008, 12:28   #3 (permalink)
Java-Forum Team
Moderator
 
Registriert seit: 13.09.2007
Fachbeiträge: 12.753
Abgegebene Danke: 215
Erhielt 810 Danke für 721 Beiträge
Mit iBatis zB kannst du dir aus einem DB Schema deine Dao Klassen generieren lassen, mit "exzessiven dynamischen gegerieren" geht das meistens schief.
maki ist gerade online  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 08.01.2008, 14:29   #4 (permalink)
Stammbenutzer
Halbes Megabyte
Themenstarter
 
Registriert seit: 03.01.2008
Fachbeiträge: 623
Abgegebene Danke: 15
Erhielt 5 Danke für 5 Beiträge
erstmal danke an euch zwei für eure antworten

@mhauert, das genericArray ist nicht das, das was ich suche
@maki, hab mir die beschreibung von iBatis jetzt mal durchgelesen...
weiss nicht so genau obs das ist was ich realisieren will;

habe mittlerweile eine vereinfachung gemacht (zwei klassen weniger!) und einen "workaround" für das dynamische erstellen der der Types gemacht;
werde morgen weiter dran arbeiten, und dann meine (hoffentlich) lösung hier posten (glaub, dass das recht kompakt gelöst werden kann!)
lumo ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 09.01.2008, 07:06   #5 (permalink)
Stammbenutzer
Halbes Megabyte
Themenstarter
 
Registriert seit: 03.01.2008
Fachbeiträge: 623
Abgegebene Danke: 15
Erhielt 5 Danke für 5 Beiträge
@mhauert
bins jetzt noch einmal durchgegangen.
das mit den generics ist ne gute idee, hier aber nicht mal nötig.
werd jetzt die daten in ein Object packen, somit kann ich alle datentypen halten, und nicht nur ein spezielles.

dazu hab ich noch ne classe gecoded, die mir die informationen hält, wie die daten heissen, und welchen typ sie haben
hier mal der code zum XHeader (was mir die column headers der tabelle hält und damit den datentyp speichert)

Code:
import java.util.Map;
import java.util.HashMap;

public class XHeader {

	// Map to map the field names with tis datatypes
	private Map<String, String> typeMap;
	
	public XHeader() {
		typeMap = new HashMap<String, String>();
	}
	 
	public String get(final String _Name) {
	   return this.typeMap.get(_Name);
	}
	
	public String add(String _Name, String _Type) {
		return this.typeMap.put(_Name, _Type);
	}
	
	//@todo nicht vollständig -> datetime etc ergänzen
	public static Object getRealType(final String dataType, String value) {
		if (dataType.equalsIgnoreCase("varchar") ||
			dataType.equalsIgnoreCase("text")) {
			return value;
		}
		else if (dataType.equalsIgnoreCase("bit")) {
			return Boolean.parseBoolean(value);
		}
		else if (dataType.equalsIgnoreCase("int") ||
			dataType.equalsIgnoreCase("smallint")) {
			return Integer.parseInt(value);
		}
		else if (dataType.equalsIgnoreCase("real") ||
				dataType.equalsIgnoreCase("float")) {
			return Float.parseFloat(value);
		}
		else
			return null;
	}
}
die dazu gehörigen daten, die ich aus meinem resultset erhalte, geb ich in eine liste vom typ object
somit habe ich die dateninformationen (types, fieldnames) getrennt von den daten und halte die redundanz recht klein.
Code:
	private List<Object> objects = new ArrayList<Object>();
gleichzeitig hab ich immer die information welcher typ es ist bereit und kann über die funktion
Code:
	getValueOf(String columnname)
den korrekten wert bekommen...

liege ich falsch?
bitte um feedback

PS: werds jetzt noch fertig implementieren und dann testen und das ergebnis hier posten
lumo ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 09.01.2008, 07:15   #6 (permalink)
Stammbenutzer
CD-R 74
 
Benutzerbild von ARadauer
 
Registriert seit: 16.09.2006
Fachbeiträge: 6.762
Abgegebene Danke: 28
Erhielt 529 Danke für 496 Beiträge
habs mir jetzt nicht genau durchgelesen.
Aber reflection ist vielleicht auch ein gutes stichwort, dass du dir ansehen solltest. damit kannst du klassen anahnd des Typ Namens instanzieren.
__________________
Welches ist das beste Buch für Anfänger? Das: Java von Kopf bis Fuss
Nach den ersten Schritten? Das: Der Weg zum Java-Profi
ARadauer ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 09.01.2008, 08:29   #7 (permalink)
Stammbenutzer
Halbes Megabyte
Themenstarter
 
Registriert seit: 03.01.2008
Fachbeiträge: 623
Abgegebene Danke: 15
Erhielt 5 Danke für 5 Beiträge
hab mittlerweile wieder was geändert...

reflection sieht sehr interessant aus, konnte jetzt aber nicht sehen, wie ich da meine klassen erzeuge und werte zuweise... ev. hab ich das übersehn oder was falsch verstanden...

bin mir auch nicht sicher ob das schneller geht als meine 2 hashmaps
eine statische hier:
Code:
private static final Map<String, Class> typeMap;
	 
	static {
	    typeMap = new HashMap<String, Class>();
	    typeMap.put("varchar", String.class);
	    typeMap.put("text", String.class);
	    
	    typeMap.put("bit", boolean.class);

	    typeMap.put("int", int.class);
	    typeMap.put("smallint", int.class);
	    
	    typeMap.put("real", float.class);
	    typeMap.put("float", float.class);
	    // etc.
	    // typeMap.put("datetime", String.class);
	}
und eine dynamische wo ich die column-namen hab und dann dahinter den java datentyp.class

*grad.etwas.verwirrt.bin*
meld mich später nochmal, wenn die verwirrung weg is
lumo ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Thema geschlossen    

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
"String" in "int" umwandeln, und dann "int" in "float" Developer_X Allgemeine Java-Themen 8 19.02.2009 15:46
ZUfällig "ja" "nein" oder "vielleic Java Basics - Anfänger-Themen 7 10.01.2009 15:24
In einem String "\" durch das "\\" erse DiJA Allgemeine Java-Themen 3 21.06.2006 13:18
Bild in JEditorPane oder Aus "" mach' "/" ulr!ch AWT, Swing, JavaFX & SWT 2 20.12.2005 09:38
Fenster ohne "verkleinern","Schliessen", AWT, Swing, JavaFX & SWT 4 18.01.2005 21:02


Lesezeichen

Forumregeln
Es ist Ihnen erlaubt, neue Themen zu verfassen.
Es ist Ihnen erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:57 Uhr.


Powered by vBulletin® Version 3.8.6 (Deutsch)
Copyright ©2000 - 2013, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.2
Thanks for Smilies by smilies.4-user.de