Я пытаюсь сгенерировать, скомпилировать и запустить 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?
Да Bootstrap ClassLoader не может найти класс, так что я пытался использовать ребенка classLoaders, но все равно не повезло, а также я попытался реализовать в качестве вашего предложения, но получил ту же ошибку. –
Вы должны узнать, каков ваш путь к классу, и поместить туда файл. Попробуйте, например. http://stackoverflow.com/a/23773036/1547337, чтобы перечислить все возможные пути. – dejvuth
Спасибо dejvuth !! Он работал после установки classpath. –