# programm soll sich selbst ändern können



## ARadauer (22. Aug 2007)

es es möclich dass sich ein java programm selbst umschreibt.

so mein gedanke:
ich speicher eine klasse meines programms in eine jar datei
ich lösch ihm in eclipse die klasse raus und füg die jar datei ein, nun sollte er sich die klasse aus der jar datei
jetzt kann ich die java datein wieder rein geben
das programm kann die java datei verändern, builden, in die jar datei packen
beim nächsten start, hat scih das programm verändert.

sinn oder unsinn?


ich könnte die java datei grundsätzlich auch ganz wo anders liegen haben, aber ich habe immer probleme mit den packages.
bis jetzt hatte ich es so, dass die java datei von einem anderen programm verändert wurde und auch gebildet wurde, nur in diesem anderen programm, waren natürlich nicht alle klassen die die zu verändernde klasse benötigt nicht vorhanden und somit hat er mit einige methoden nicht compiliert.

was haltet ihr von diesem ansatz? wo könnte es probleme geben oder wie würdet ihr sowas machen?



ps: ist es gefährlich programme zu schreiben die sich ändern können?    matrix, terminator, gibt ja genug beispiele


----------



## AlArenal (22. Aug 2007)

Gegenfrage: Welchem konkreten Zweck soll dieses Verhalten in deinem Programm dienen?

P.S.:
Sich selbst verändernder Code ändert sich zur Laufzeit und arbeitet nicht notwendigerweise mit Hackentricks wie der Ablage als ausführbare Datei.


----------



## FenchelT (22. Aug 2007)

Hallo,

mir, als Java-Laie erschliesst sich der Sinn und Zweck nicht ganz.
Wofuer brauchst Du das im praktischen Einsatz?

Welcher Anwendungsfall erfordert es, dass ein Programm eine KLasse eines anderen / des gleichen Programmes umschreibt?

Welchen Nutzen hat das?


Viele Gruesse
FenchelT


----------



## FenchelT (22. Aug 2007)

Mist zu spaet  :wink:


----------



## ARadauer (22. Aug 2007)

eine java datei builden, also java -> class
wie mach ich das am besten ohne eclipse, optimal für meinen zweck aus einem java programm heraus?

über 	Runtime.getRuntime().exec(), javac aufrufen,
jedoch was mache ich wenn keine jdk installiert ist?

btw: warum kann eclipse eigentlich compilieren, auch wenn keine jdk installiert ist? hat es einen eigenen compiler dabei?


----------



## ARadauer (22. Aug 2007)

der sinn und zweck ist sehr komplex,
aber grundsätzlich: der anwender hat die möglichkeit die kompletten berechnungen, datenfelder, datenbank zugriffe über eine excel datei zu konfigureren. ein wartungstool erstellt dann aufgrund dieser excel daeti eine kern berechnungsklasse in der die zugriffe und berechnungen verwaltet werden.

funktioniert auch alles schön und gut, nur ich kopier halt händisch dateien hin und her und starte immer alles aus eclipse. ich will aber das es ohne eclipse und manuelles kopieren funktioniert.


----------



## André Uhres (22. Aug 2007)

Ich hab sowas noch nie gemacht und seh auch keinen Sinn darin.
Es widerspricht total der Definition von Programm: ein im Voraus festgesetzter Ablauf. 
Natürlich macht man auch Programmänderungen. Aber die sollten wohl kaum dem Programm selbst überlassen werden :wink:
Das wäre in der Tat gefährlich!


----------



## Rock Lobster (22. Aug 2007)

> optimal für meinen zweck



Solang Du Deinen Zweck hier nicht erklärst, wird wohl keine Sau blicken, was Du vorhast, und es wird Dir folglich auch keiner helfen können.

Das ist wie wenn ich frage "kann man Geräte bauen, die an ihren eigenen Schrauben das Gewinde abschleifen", das dürfte jedem erstmal total unsinnig erscheinen, und es wird mir erst einer helfen, wenn ich auch erkläre, WARUM ich das überhaupt will. Oftmals gibt's dann ein klares "Ja", ein klares "Nein", oder zumindest einen guten Alternativ-Vorschlag, der dem Zweck sogar noch viel besser dient.


*EDIT*: Okay, jetzt hast Du es ja doch erklärt. Also im Grunde gibt es Code-Generatoren, z.B. Hibernate, das erstellt Dir passende Klassen für entsprechende Datenbank-Objekte. Das wird allerdings nicht zur Laufzeit gemacht. Grundsätzlich ist es jedoch möglich, dann mußt Du aber einen Classloader benutzen und evtl. sogar den Compiler direkt aus dem Programm raus aufrufen. Du kannst Dir aber auch BeanShell anschauen, das ist eine Möglichkeit, um Skripte in Form von Java-Code einzubauen. Das heißt, Du kannst Dir dort Code generieren, der direkt ausgeführt wird ohne daß Du ihn von Hand compilieren mußt.


----------



## ms (22. Aug 2007)

Ich glaube hier liegt ein Verständnisproblem vor.

Wenn du als Ergebnis dieser "Anwender-in-Excel-eingabe-daraus-Javaklasse-generierung" eh schon eine Javaklasse erhältst, dann einfach ein Buildscript mit z.B. Ant schreiben welches kompiliert und die Applikation neu buildet.

ms


----------



## Wildcard (22. Aug 2007)

Davon abgesehen das sich selbst modifzierender Code schon vor Jahren auf Eis gelegt wurde, ist der Compiler über die API erreichbar.


----------



## Beni (22. Aug 2007)

Oder benutz eine Scriptengine um deine Berechnungen zu machen. z.B. ist in Java 1.6 JavaScript schon eingebaut (andere Sprachen lassen sich im Netz finden).


----------



## AlArenal (22. Aug 2007)

Warum generiert das Tool Java-Code, der dann erst eingebacken werden muss? Tuts nicht auch das Schreiben der Daten in eine Konfigurationsdatei?

Ich glaube ehrlich gesagt nicht, dass jenes Tool selbst großartig funktionellen Code erzeugt, sondern baut einfach aus ner Vorlage was zusammen und ersetzt vorgegeben Felder mit den aus dem Excel-Sheet eingelesenen Werten. Sollte ich falsch liegen, müsste das ein raffetückisches Ding sein und ich würde mal über dein Einsatz einer Script-Engine oder Jikes nachdenken...


----------



## ARadauer (22. Aug 2007)

danke für eure beiträge:

also property datei bzw die excel datei als property datei zu verwenden und alles zur laufzeit machen, zu dem ist das vorgehen zu komplex. hab ich schon versucht.

scripting engine, ja guter einwand, habt ihr recht, wär vielleicht besser, aber jetzt funktioniert mein programm schon und ich muss bald fertig werden.



> Compiler über die API erreichbar.


 ahh das ist interessant! das bringt mich der lösung ein ganzes stück weiter...


----------



## Yzebär (22. Aug 2007)

ARadauer hat gesagt.:
			
		

> danke für eure beiträge:
> 
> also property datei bzw die excel datei als property datei zu verwenden und alles zur laufzeit machen, zu dem ist das vorgehen zu komplex. hab ich schon versucht.



Aber nicht komplex genug, um eine Klasse umzuschreiben oder was? Sorry, aber mögen dir die Anwender deine Frickelei um die Ohren hauen, damit du aus der Sache was lernst und nicht noch einmal solchen Unsinn verzapfst...


----------



## AlArenal (22. Aug 2007)

Hihi...


----------



## Saxony (22. Aug 2007)

Wildcard hat gesagt.:
			
		

> Davon abgesehen das sich selbst modifzierender Code schon vor Jahren auf Eis gelegt wurde, ist der Compiler über die API erreichbar.



Wie meinst du das?

In den neueren Java SDKs wurde ja sun.tools.jar.Main entfernt, da man davon den Quellcode nicht mit offen legen wollte.

Somit kann ich auch nicht Main#compile() mehr verwenden.

Wie kann man aber trotzdem noch weiterhin zur Laufzeit kompilieren ?

bye Saxony


----------



## Wildcard (22. Aug 2007)

Die Klassen im sun package gehen dich als Entwickler nichts an. SUN erklärt sehr deutlich das diese Klassen kein Teil der public API sind.
http://java.sun.com/javase/6/docs/api/javax/tools/ToolProvider.html#getSystemJavaCompiler()


----------



## byte (22. Aug 2007)

ARadauer hat gesagt.:
			
		

> btw: warum kann eclipse eigentlich compilieren, auch wenn keine jdk installiert ist? hat es einen eigenen compiler dabei?



Ja.

@Frage: Ant-Script?


----------



## Saxony (22. Aug 2007)

Wildcard hat gesagt.:
			
		

> Die Klassen im sun package gehen dich als Entwickler nichts an.



Hmm naja.


----------



## Wildcard (22. Aug 2007)

Saxony hat gesagt.:
			
		

> Hmm naja.


http://java.sun.com/products/jdk/faq/faq-sun-packages.html


----------



## Saxony (22. Aug 2007)

Hiho,

das mit der verlorenen Plattformunabhängigkeit ist dann natürlich Mist.

bye Saxony


----------

