2016-05-10 11 views
0

Ich versuche Java-Klasse zu generieren, zu kompilieren und durch ein Programm mit Reflektion auszuführen. Ich bin in der Lage, die Datei erfolgreich zu generieren und zu kompilieren, aber beim Ausführen der Datei die ClassNotFoundException abzurufen.Java-Klasse generieren, kompilieren und ausführen durch Java-Programm

package javaapplication2; 

/** 
* 
* @author sachin.maurya 
*/ 
import java.io.*; 
import java.util.*; 
import java.lang.reflect.*; 
import java.lang.ClassLoader; 
public class MakeTodayClass { 
    Date today = new Date(); 
    String todayMillis = Long.toString(today.getTime()); 
    String todayClass = "z_" + todayMillis; 
    String todaySource = "C:\\Users\\sachin.maurya\\Documents\\NetBeansProjects\\JavaApplication2\\src\\javaapplication2\\"+todayClass + ".java"; 

    public static void main (String args[]) throws InterruptedException, IOException, ClassNotFoundException, InstantiationException, IllegalAccessException{ 
    MakeTodayClass mtc = new MakeTodayClass(); 
    mtc.createIt(); 
    if (mtc.compileIt()) { 
     System.out.println("Running " + mtc.todayClass + ":\n\n"); 
     Thread.sleep(2000); 
     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); 
    return (baos.toString().indexOf("error")==-1); 
    } 

    public void runIt() throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException { 
    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(); 
     } 

    } 

} 

Lauf:

Running z_1462876181460: 


1462874906040 
javaapplication2.Runner.runner() 
java.lang.ClassNotFoundException: z_1462876181460 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
    at javaapplication2.Runner.runner(Runner.java:24) 
    at javaapplication2.MakeTodayClass.runIt(MakeTodayClass.java:70) 
    at javaapplication2.MakeTodayClass.main(MakeTodayClass.java:28) 
BUILD SUCCESSFUL (total time: 2 seconds) 

Wenn ich hart codieren den Wert von ‚todayClass‘ Wert, dh einige Klassendatei erzeugt früher als runit() Funktion funktioniert einwandfrei, so scheint es, wegen zu sein zum Workflow von ClassLoader, aber ich bin mir nicht sicher. Kann eine generierte .class-Datei ausgeführt werden?

Antwort

0

Das Problem ist, dass die ClassLoader die erstellte Klasse im Klassenpfad nicht finden kann.

Die einfachste Lösung ist, die Dateien Lage anders zu definieren, vielleicht so etwas wie (unter der Annahme, dass bin in Ihrem Klassenpfad ist):

String todaySource = "C:\\Users\\sachin.maurya\\Documents\\NetBeansProjects\\JavaApplication2\\bin\\"+todayClass + ".java"; 
+0

Ja Bootstrap Classloader ist nicht in der Lage Klasse zu finden, so habe ich versucht, Kind zu verwenden, ClassLoaders aber immer noch kein Glück und auch ich habe versucht, als Ihren Vorschlag zu implementieren, aber immer den gleichen Fehler. –

+0

Sie sollten herausfinden, was Ihr Klassenpfad ist, und legen Sie die Datei dort. Versuchen Sie z.B. http://stackoverflow.com/a/23773036/1547337 um alle möglichen Pfade aufzulisten. – dejvuth

+0

Danke dejvuth !! Es funktionierte nach dem Setzen von Klassenpfad. –