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