kompilacja kodu zrółdłowego run-time

0

Witam

Potrzebuje napisać program do rysowania wykresów. Funkcja będzie podawana w textbox'ie.
Chce utworzyć klase jakoś z metodą jak ta

double funkcja(double x)
{
      return zawatość_texbox;
}

Jak to jż mam to trzeba to spompilować i wywoływać metode funkcja.
Czy mógłby ktoś wkleić jakiś najprostszy nawet kod jak to skompilować i uruchomić.

Z góry dziękuje za pomoc

0

Może być niezbyt prosty, ale za to działający ?
pozdrawiam

0

Witam

Wklej jakiś fragment dzałający i to mi wystarczy reszte sobie zrobie.

0

Mój program działa tak: użytkownik wpisuje w polu tekstowym wyrażenie, na podstawie wyrażenia powstaje nowa klasa, program korzysta z tej klasy by rysować.
Nowo powstała klasa implementuje taki interface:

package bs.math.wykresy;

public interface Function
{
    double compute(double x);
}

część kompilująca wygląda tak:

    private boolean kompiluj(String nameOfClass,String function,String html) 
    // parametr  html jest wykorzystywany tylko do opisania funkcji
    {
        boolean ok=true;
        String sep=System.getProperty("file.separator","\\");
        String txt="package bs.math.wykresy;\n\npublic class "+nameOfClass+
                   " implements Function\n{\n    public double compute(double x)\n    {\n        return "+
                   function+";\n    }\n}";
        if(!My.writeToFile(txt,outputDirectory+sep+nameOfClass+".java")) 
        //moja metoda wygodnego pisania do plików
        {
            My.say("<html>Nie powiodło się utworzenie pliku<br><font  
                       color=\"blue\">"+nameOfClass+".java</font></html>",this);
            // wygodny (dla mnie) sposób wywołania JOptionPane.showMessageDialog()
            return false;
        }
        else
        {
       	    toDelete.add(nameOfClass);
        }
        try
        {
            // tu się zaczyna kompilacja
            String[]         cmd={"javac.exe","-d","\""+outputDirectory+"\"","\""+outputDirectory+sep+nameOfClass+".java\""};
       	    Process p=Runtime.getRuntime().exec(cmd);
       	    p.waitFor();
       	    Thread.sleep(2000);
       	    int error=p.exitValue();
       	    if(error!=0)
       	    {
                ok=false;
                My.say("<html><center>Błąd podczas kompilacji<br>sprawdź składnię</center></html>",this);
            }
        }
        catch (InterruptedException e)
        {
            ok=false;
        }
        catch (Exception e)
        {
       	    My.say("<html>Błąd podczas wykonywania programu <font color=\"blue\">javac</font></html>",this);
       	    ok=false;
        }
        if(ok)
        {
            try
            {
                // tu się zaczyna ładowanie właśnie utworzonej klasy
            	Class klasa=null;
            	if(loader!=null)
            	{
            	    klasa=loader.loadClass("bs.math.wykresy."+nameOfClass);
            	}
            	else
            	{
                    klasa=Class.forName("bs.math.wykresy."+nameOfClass);
            	}
                Function f=(Function)klasa.newInstance();
                functions.put(function,f);
                chooseNewFunction.addItem(function);
                newFunctions.add(new CompiledFunction(function,html,nameOfClass,f));

            }
            catch(Exception e)
            {
                My.say("<html><center>Nie powiodło się utworzenie obiektu klasy <br><font color=\"blue\">"+nameOfClass+"</font><center></html>",this);
                ok=false;
            }
        }
        return ok;
    }

spore fragmenty są niepotrzebne, ale bałem się, że podczas wycinania wywalę za dużo, "chirurgię" zostawiam tobie
pozdrawiam

0

Jeszcze jeden fragment, który przekształca wzór wpisany przez użytkownika, np z

cos()+sin(PI*x)

robi

Math.cos(x)+Math.sin(Math.PI*x)
    private String translate(String source)
    {
        String target=source.replace("()","(x)");
        target=target.replace("E","Math.E");
        target=target.replace("PI","Math.PI");
        target=target.replace("acos","hokus-pokus");
        target=target.replace("asin","abrakadabra");
        for(int i=0;i<namesOfFunctions.size();i++)
        {
            target=target.replace(namesOfFunctions.elementAt(i),"Math."+namesOfFunctions.elementAt(i));
        }
        target=target.replace("hokus-pokus","Math.acos");
        target=target.replace("abrakadabra","Math.asin");
        while(target.indexOf("Math.Math.")>=0)
        {
            target=target.replace("Math.Math.","Math.");
        }
        return target;
    }
Vector<String> namesOfFunctions

zawiera nazwy metod klasy Math

0

Witam

No niezły program. Rzecz w tym, że to ma działać jako applet więc o uruchomieniu javac.exe mozna raczej pomarzyć. i w ogóle dostępie do dysku.

Chodziło mi raczej o skompilowanie tego z użyciem jakieś metody z jakiejś klasy np, z pakietu java.lang.reflect .

Pozdrawiam

0

Chyba nie rozumiesz znaczenia słowa "skompilować"
pozdrawiam

0

Witam

Hehe. To przecieŻ też kompilacja tylko do pamięci nie do pliku.

Z tonu wypowiedzi wnioskuje że nie ma rozwiązania tego problemu ???

Pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1