Criando um código em Java, compilando e executando dinamicamente

Veja nesta dica como gerar um código Java, fazer a compilação e depois rodar em tempo de execução.

Criando um código em Java, compilando e executando dinamicamente

 

Veja nesta dica como gerar um código Java, fazer a compilação e depois rodar em tempo de execução.

 

<B><SPAN >import </SPAN></B><SPAN >java.io.*;</SPAN>
<B><SPAN >import </SPAN></B><SPAN >java.util.*;</SPAN>
<B><SPAN >import </SPAN></B><SPAN >java.lang.reflect.*;</SPAN>

<B><SPAN >public class </SPAN></B><SPAN >MakeTodayClass {</SPAN>
<SPAN >  </SPAN><SPAN >Date today = </SPAN><B><SPAN >new </SPAN></B><SPAN >Date();</SPAN>
<SPAN >  </SPAN><SPAN >String todayMillis = Long.toString(today.getTime());</SPAN>
<SPAN >  </SPAN><SPAN >String todayClass = </SPAN><SPAN >"z_" </SPAN><SPAN >+ todayMillis;</SPAN>
<SPAN >  </SPAN><SPAN >String todaySource = todayClass + </SPAN><SPAN >".java"</SPAN><SPAN >;</SPAN>
<SPAN >  </SPAN>
<SPAN >  </SPAN><B><SPAN >public static void </SPAN></B><SPAN >main (String args[]){</SPAN>
<SPAN >MakeTodayClass mtc = </SPAN><B><SPAN >new </SPAN></B><SPAN >MakeTodayClass();</SPAN>
<SPAN >mtc.createIt();</SPAN>
<B><SPAN >if </SPAN></B><SPAN >(mtc.compileIt()) {</SPAN>
<SPAN >System.out.println(</SPAN><SPAN >"Executando " </SPAN><SPAN >+ mtc.todayClass + </SPAN><SPAN >":\n\n"</SPAN><SPAN >);</SPAN>
<SPAN >mtc.runIt();</SPAN>
<SPAN >}</SPAN>
<B><SPAN >else</SPAN></B>
<SPAN >System.out.println(mtc.todaySource + </SPAN><SPAN >" é ruim."</SPAN><SPAN >);</SPAN>
<SPAN >}</SPAN>

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

<B><SPAN >new </SPAN></B><SPAN >sun.tools.javac.Main(baos,source[</SPAN><SPAN >0</SPAN><SPAN >]).compile(source);</SPAN>
<SPAN >// se você usa JDK >= 1.3 então use</SPAN>
<SPAN >//   public static int com.sun.tools.javac.Main.compile(source);    </SPAN>
<B><SPAN >return </SPAN></B><SPAN >(baos.toString().indexOf(</SPAN><SPAN >"erro"</SPAN><SPAN >)==-</SPAN><SPAN >1</SPAN><SPAN >);</SPAN>
<SPAN >}</SPAN>

<SPAN >  </SPAN><B><SPAN >public void </SPAN></B><SPAN >runIt() {</SPAN>
<B><SPAN >try </SPAN></B><SPAN >{</SPAN>
<SPAN >Class params[] = {};</SPAN>
<SPAN >Object paramsObj[] = {};</SPAN>
<SPAN >Class thisClass = Class.forName(todayClass);</SPAN>
<SPAN >Object iClass = thisClass.newInstance();</SPAN>
<SPAN >Method thisMethod = thisClass.getDeclaredMethod(</SPAN><SPAN >"doit"</SPAN><SPAN >, params);</SPAN>
<SPAN >thisMethod.invoke(iClass, paramsObj);</SPAN>
<SPAN >}</SPAN>
<B><SPAN >catch </SPAN></B><SPAN >(Exception e) {</SPAN>
<SPAN >e.printStackTrace();</SPAN>
<SPAN >}</SPAN>
<SPAN >}</SPAN>
<SPAN > </SPAN><SPAN >}</SPAN>

Artigos relacionados