2016-05-10 4 views
0

Я пытаюсь сгенерировать, скомпилировать и запустить Java-класс через программу с использованием отражения. Я могу успешно сгенерировать и скомпилировать файл, но при запуске файла получить ClassNotFoundException.Сгенерировать, скомпилировать и запустить Java-класс через Java-программу

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(); 
     } 

    } 

} 

пробег:

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) 

Когда я жёстко значение значения «todayClass» т.е. некоторого класса файла, созданного ранее, то функция runIt() работает правильно, так это, кажется, из-за для рабочего процесса ClassLoader, но я не уверен. Возможно ли запустить сгенерированный файл .class?

ответ

0

Проблема в том, что ClassLoader не может найти созданный класс в пути к классу.

Самое простое решение состоит в определении вашего местоположения файла по-другому, возможно, что-то вроде (в предположении, что bin в вашем пути к классам):

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

Да Bootstrap ClassLoader не может найти класс, так что я пытался использовать ребенка classLoaders, но все равно не повезло, а также я попытался реализовать в качестве вашего предложения, но получил ту же ошибку. –

+0

Вы должны узнать, каков ваш путь к классу, и поместить туда файл. Попробуйте, например. http://stackoverflow.com/a/23773036/1547337, чтобы перечислить все возможные пути. – dejvuth

+0

Спасибо dejvuth !! Он работал после установки classpath. –