# Methoden dynamisch erstellen



## krey (29. Mrz 2006)

Hi, ich wollte mal fragen ob folgendes möglich ist: (und wenn ja, dann wie)

Es gibt eine Collection mit X Elementen in einem Objekt.
{bla1,bla2,bla3,bla4}

Gibt es eine Möglichkeit dynamisch Mehtoden wie "getBla1()" usw zu erstellen?
Also nicht mit einer IDE sondern zur Laufzeit. 

Und wenn die Methoden schon eine Funktionalität besitzen sollen?


```
public String getBla1() {
  bla1 = bla1*var_irgendwas;
  return bla1;
}
```

Kann man sich Gerüste für so etwas schreiben?
Ist es vieleicht möglich das mit der Reflection API umzusetzen?


----------



## AlArenal (29. Mrz 2006)

Nein, eine solche Möglichkeit gibt es nicht.
Wozu glaubst du das zu brauchen?


----------



## krey (29. Mrz 2006)

AlArenal hat gesagt.:
			
		

> Nein, eine solche Möglichkeit gibt es nicht.
> Wozu glaubst du das zu brauchen?



Um mir viel Schreibarbeit zu sparen und den Code nicht mit unzähligen gettern und settern aufzublasen. 
Wenn Metoden im Programm vorhanden sein sollen (möglicherweise mit vorgefertigter Funktionalität) die nach der Notation get[Var]() ... sein sollen und man nicht direkt eine Collection mit Wertepaaren aus dem Objekt holen will. Alternativ ist es ja möglich eine get(String var) Methode zu schreiben, diese könnte dann eine Hashmap etc durchlaufen aber das wäre dann ja nichtmehr nach der Konention get[Var]() bzw set[Var]() ...


----------



## KSG9|sebastian (29. Mrz 2006)

ja, ich weiß nicht ob das wirklich ein guter "Tausch" ist..selbst wenn es irgendwie geht

10 Minuten Zeit gespart aber dafür absolut unleserlichen Code


----------



## AlArenal (29. Mrz 2006)

Also um für eine beliebige Anzahl von Member-Variablen Standard-Getter und -Setter zu erzeugen, brauche ich in Eclipse nur wenige Mausklicks. Ansonsten ist die Vererbung bisher immer mein Freund gewesen.

Wer sollte denn auch noch durch ein Programm durchblicken und es debuggen können, wenn man beliebig zur Laufzeit den Code überall ändern kann? Wenn ich mich recht entsinne, geht das in Smalltalk und Ruby... Mglw. kann man sowas auch mit Aspekt-Orientierung machen (allerdings, glaube ich, dann auch nicht erst zur Laufzeit), wäre dann nur die Frage, ob der Aufwand der Einarbeitung in ein entsprechendes Framework sich auszahlt.


----------



## krey (29. Mrz 2006)

AlArenal hat gesagt.:
			
		

> Also um für eine beliebige Anzahl von Member-Variablen Standard-Getter und -Setter zu erzeugen, brauche ich in Eclipse nur wenige Mausklicks. Ansonsten ist die Vererbung bisher immer mein Freund gewesen.
> 
> Wer sollte denn auch noch durch ein Programm durchblicken und es debuggen können, wenn man beliebig zur Laufzeit den Code überall ändern kann? Wenn ich mich recht entsinne, geht das in Smalltalk und Ruby... Mglw. kann man sowas auch mit Aspekt-Orientierung machen (allerdings, glaube ich, dann auch nicht erst zur Laufzeit), wäre dann nur die Frage, ob der Aufwand der Einarbeitung in ein entsprechendes Framework sich auszahlt.



Solch ein Framework zu schreiben und zu durchdenken dürfte doch kein großes Problem darstellen. In Scriptsprachen wie PHP, Perl und Tcl gibt es schon seit langem Möglichkeiten soetwas zu realisieren. Naja für Java gibt es jetzt ja auch eine BeanShell  Naja Scripten mit java? Nix ganzes und nix halbes. Wäre aber schön gewesen so ein Sprachelement gehabt zu haben. Außerdem ok in Eclipse geht das mit ein paar clicks... Aber naja wenn man ein einem Objekt mehrere hundert Attribute hat? Besonders der Gedanke der Gerüste für Klassen treibt mich.. Soetwas bietet Eclipse nicht, auf jeden Fall nicht soweit ich weiß...


----------



## AlArenal (29. Mrz 2006)

krey hat gesagt.:
			
		

> Solch ein Framework zu schreiben und zu durchdenken dürfte doch kein großes Problem darstellen. In Scriptsprachen wie PHP, Perl und Tcl gibt es schon seit langem Möglichkeiten soetwas zu realisieren.



In *Skript*sprachen ist es auch kein Problem dynamisch am Quellcode zu frickeln. Nur ist Java nunmal keine Skriptsprache. BTW. wäre mir auch nicht geläufig, wie man den Code eines Objekts in PHP zur Laufzeit ändern können sollte...



> Naja für Java gibt es jetzt ja auch eine BeanShell  Naja Scripten mit java? Nix ganzes und nix halbes. Wäre aber schön gewesen so ein Sprachelement gehabt zu haben.



Und Groovy, und Jython und und und
Ich bin mir aber nicht sicher, ob man dort eine bereits existierende Klasse ändern kann, ohne Vererbung. Kann ich mir gerade nicht vorstellen, da die o.g. Skriptsprachen an die Möglichkeiten und Unmöglichkeiten des Java Bytecodes gebunden sind. Müsstest du dir ggf. mal deren Doku reinziehen.



> Außerdem ok in Eclipse geht das mit ein paar clicks... Aber naja wenn man ein einem Objekt mehrere hundert Attribute hat?



Dann gehts auch mit Eclipse. Allerdings sollte man mit dem Code dann nicht hausieren gehen, sonst sterben um einen herum die Entwickler an Lachkrämpfen.. mehrere hundert Attribute... :lol:



> Besonders der Gedanke der Gerüste für Klassen treibt mich.. Soetwas bietet Eclipse nicht, auf jeden Fall nicht soweit ich weiß...



Was Datenobjekte betrifft, gibts nen Arsch voll Frameworks im Bereich OR-Mapping, aber auch da wird nichts zur Laufzeut erzeugt, sondern im Vornherein die Struktur untersucht und dann ein Code-Gerüst ausgespuckt.


----------



## bygones (29. Mrz 2006)

sorry, aber ein meiner Ansicht nach unsinniges Feature nur weil man damit 5 Minuten weniger zu schreiben hat einzubauen, dass den Code unleserlich macht und schwer verständlich.... nene


----------



## Murray (29. Mrz 2006)

Es gibt Möglichkeiten, eine Klasse vor dem Laden (also zur Laufzeit) "anzureichern", also z.B. neue Methoden hinzuzufügen. Dazu kann man z.B. ASM verwenden. Du willst hier ja aber noch mehr: wenn Getter für die Inhalte einer Collection angelegt werden sollen, dann geht das ja um Instanzdaten; verschiedene Instanzen der gleichen Klasse müssten dann unterschiedliche Methoden haben - das wird wohl nicht gehen.


----------



## krey (29. Mrz 2006)

AlArenal hat gesagt.:
			
		

> Was Datenobjekte betrifft, gibts nen Arsch voll Frameworks im Bereich OR-Mapping, aber auch da wird nichts zur Laufzeut erzeugt, sondern im Vornherein die Struktur untersucht und dann ein Code-Gerüst ausgespuckt.



Hört sich doch schonmal ganz gut an! Was sind denn das für Frameworks? Bzw welche großen bekannten gibt es und in welche lohnt es sich einzuarbeiten?


----------



## AlArenal (29. Mrz 2006)

Wie gesagt sind das Tools zum OR-Mapping. Die bringen die nur was, wenn du deine Daten in einer RDBMS hast. Hibernate und Castor sind denke ich mal aktuell die beiden bekanntesten freien Vertreter für Java.


----------



## gizmo (9. Mai 2006)

Weiss nicht ob das Thema noch aktuell ist... aber warum nimmst du nicht einfach eine HashMap?


----------



## Thogo (10. Mai 2006)

Ein potentieller Ansatz wäre einen eigenen Classloader zu schreiben.

Siehe http://www.panix.com/~mito/articles/articles/classloader/j-classloader-ltr.pdf
Im Artikel ist ein on-the-fly compilieren umgesetzt.
Dynamisch generierter Code wird im Ausblick genannt.

oder eine Klasse aus XML generieren:
Make classes from XML data
ftp://www6.software.ibm.com/software/developer/library/data-binding2.pdf

Gruß
_____
/hogo


----------

