Re: Crear clase en tiempo de ejecuci ón

Sebastian Gurin <sgurin-nLx/x0uvtyR/[email protected]> Sun, 9 Aug 2009 19:26:05 -0300
Newsgroups gmane.comp.java.javaspain
Organization softpoint
Message-ID <[email protected]>
ojo con esto... No acabo de entender cuáles son tus requerimientos, pero si lo que quieres es persistir los objetos de tu applicación entonces no es por el lado de carga dinámica de clases que lo resuelves, sino por el lado de serialización de objetos java a xml. Son cosas distintas.

Utiliza la carga dinámica de clases solo cuando ya no te quede otra... o sea, cuando el requerimiento sea que el usuario pueda insertar su propia implementación de cierto comportamiento en caliente (sin tener que detener la aplicación, agregar el código, compilar y reiniciar la aplicación). 

Si "las variantes" del comportamiento se conocen todas, en ese caso te conviene implementarlas a cada una de ellas en una clase java por separado, y utilizar el patrón de diseño Strategy para que el usuario pueda intercambiar de "variante" dinámicamente. Utiliza dynamic class loading solo cuando el requerimiento sea que las alternativas puedan ser definidas y "publicadas" dinámicamente.

En el caso de que la carga dinámica de clases se alo que necesites, a continuación pego un código que hace los pasos 1, 2 y 3 que mencionas en otro mail. Suerte!

import java.io.*;
import java.util.*;
import java.lang.reflect.*;

public class MakeTodayClass {
  Date today = new Date();
  String todayMillis = Long.toString(today.getTime());
  String todayClass = "z_" + todayMillis;
  String todaySource = todayClass + ".java";
  
  public static void main (String args[]){
    MakeTodayClass mtc = new MakeTodayClass();
    mtc.createIt();
    if (mtc.compileIt()) {
       System.out.println("Running " + mtc.todayClass + ":\n\n");
       mtc.runIt();
       }
    else
       System.out.println(mtc.todaySource + " is bad.");
    }

  public void createIt() {
    try {
      FileWriter aWriter = new FileWriter(todaySource, true);
      aWriter.write("public class "+ todayClass + "{");
      aWriter.write(" public void doit() {");
      aWriter.write(" System.out.println(\""+todayMillis+"\");");
      aWriter.write(" }}\n");
      aWriter.flush();      
      aWriter.close();
      }
    catch(Exception e){
      e.printStackTrace();
      }
    }
  
  public boolean compileIt() {
    String [] source = { new String(todaySource)};
    ByteArrayOutputStream baos= new ByteArrayOutputStream();

    new sun.tools.javac.Main(baos,source[0]).compile(source);
    // if using JDK >= 1.3 then use
    //   public static int com.sun.tools.javac.Main.compile(source);    
    return (baos.toString().indexOf("error")==-1);
    }
    
  public void runIt() {
    try {
      Class params[] = {};
      Object paramsObj[] = {};
      Class thisClass = Class.forName(todayClass);
      Object iClass = thisClass.newInstance();
      Method thisMethod = thisClass.getDeclaredMethod("doit", params);
      thisMethod.invoke(iClass, paramsObj);
      }
    catch (Exception e) {
      e.printStackTrace();
      }
    }
 }



On Sun, 9 Aug 2009 22:57:16 +0200
yamsung lage <[email protected]> wrote:

> > Uhm... no veo por qué necesitarías esta clase. ¿Puedes poner un ejemplo?
> 
> No entiendo lo que dices pero bueno trato de ponerte un ejemplo...
> 
> Imaginate un programa en java que sea un simulador, entonces le debes
> pasar un archivo (Xml, o cualquiera). En este archivo se especifican
> unos objetos con sus datos miembros (ubicacion, color, etc) y sus
> funciones (cambiar de color, cambiar de posicion, girar, etc).
> 
> Bueno la idea es que cuando el programa reciba el archivo, lo abra,
> identifique los objetos y los cree en tiempo de ejecución.
> 
> Asi este archivo puede tener varios objetos, por ejemplo: Robot, caja,
> camion, etc. Y estos a su vez varias atributos con varios metodos.
> 
> Sergio, espero haberme hecho explicar
> 
> 
> 2009/8/9 Sergio Arbeo <[email protected]>:
> >
> >
> > 2009/8/9 yamsung lage <[email protected]>:
> >
> >>
> >>
> >> Alguien tiene información de como crear una clase en tiempo de ejecucion
> >> ?.
> >>
> >> Por ejemplo, tengo un nombre Robot, entonces en tiempo de ejecucion
> >> quiero crear una clase de nombre Robot con varias funciones y
> >> atributos, y esta misma clase poder usarla en el momento.
> >
> >
> > Un saludo,
> >
> > Serabe
> >
> > --
> > http://sergio.arbeo.net
> > http://www.serabe.com
> > 
> 


-- 
Sebastian Gurin <sgurin-nLx/x0uvtyR/[email protected]>