# Fieser Hack.



## DocMcFly (28. Feb 2006)

Hallo,

Ich möchte gerne mich informieren und fragen, ob das überhaupt mit Java möglich ist. 

Folgender *hypotetischer Fall*:

1. Ich habe einen ApplicationServer zB Tomcat. und eine Datenbank zB PostgreSQL / Oracle
2. Es läuft eine Applikation: Das Kernsystem. 
3. An dieses Kernsystem kann ich einen Schlüssel senden. zB  eine ID.
4. Das Kernsystem holt aus der DB einen Blob. 
5. Der Blob ist eine kompilierte JAVA-Klasse.
6. Die JAVA-Klasse ist ein implements eines Interfaceses.
7. Das Kernsystem ruft die Klasse auf  und bekommt einen Rückgabewert. zB blobClass.execute( parameter );
8. Das kernsystem wirft die Klasse wieder weg und kann den nächsten Schlüssel verarbeiten... usw.

Bis Punkt 5 kann ich das ohne Probleme... Aber 6. und 7. machen mir Probleme. Geht das überhaupt? Kann ich irgendwie eine Klasse aus dem RAM ausführen? Oder müsste ich die erst ins Filesystem legen? (Was die Sache nur langsam macht!) Oder kann ich während der Laufzeit überhaupt Klassenaustauschen? Muss ich dann eine paralellen Thread erzeugen, der aus der neuen Klasse besteht... Oder geht das anders viel einfacher...
Problem ist, ich möchte, dass das Kernsystem statisch bleibt - Ich möchte immer wieder neue Funktionen hinzufügen/auswechseln oder löschen, ohne das Kernsystem zu berühren. Sprich neu zu kompilieren.  

Das hört sich alles sehr komisch an... Aber ich habe ein ähnliches System unter PHP (mit dem eval()-Befehl) nur das ist mir zu langsam und ich würde gerne in diesem Projekt auf Java umsteigen...

Danke fürs Lesen und Antworten
Gruß Clemens


----------



## AlArenal (28. Feb 2006)

Ich hab derartiges noch nicht gemacht, daher mal hypothetisch:


Wenn ich mir die Doku vom ClassLoader ansehe sollte es mal ziemlich peng sein, ob ich die Klasse von der Platte lese, oder mir per Wurmloch aus nem paralleluniversum sauge. In der Doku findet sich ja auch grob umrissen ein Beispiel für nen ClassLoader auf Netzwerkbasis, da sollte analog auch sowas auf DB-Basis möglich sein:


```
For example, an application could create a network class 
loader to download class files from a server. Sample code might 
look like:

       ClassLoader loader = new NetworkClassLoader(host, port);
       Object main = loader.loadClass("Main", true).newInstance();
    	  . . .
     

The network class loader subclass must define the methods findClass 
and loadClassData to load a class from the network. Once it has 
downloaded the bytes that make up the class, it should use the 
method defineClass to create a class instance. A sample 
implementation is:

         class NetworkClassLoader extends ClassLoader {
             String host;
             int port;

             public Class findClass(String name) {
                 byte[] b = loadClassData(name);
                 return defineClass(name, b, 0, b.length);
             }

             private byte[] loadClassData(String name) {
                 // load the class data from the connection
                  . . .
             }
         }
```


----------



## Roar (28. Feb 2006)

hi
frage nummer 1: müssen die klassen in der datenbank liegen? kommt mir spanisch vor. aber egal:
schau dir mal ClassLoader#defineClass(...) an. da kannst du ein byte[] übergeben und der macht dir nen Class draus. die methode is protected, also musst du ne unterklasse von (URL)ClassLoader schreiben.


----------



## DocMcFly (28. Feb 2006)

Das klingt ja vielversprechend... ich werde mir gleich die ClassLoader-Lektüre mal reinziehen...

Danke Clemens


----------

