Я не специалист по Java, и я довольно новичок во всей концепции компиляции и запуска динамически сгенерированного кода, которая так проста в других языках, особенно в языках сценариев, таких как Javascript и PHP.
Я слежу за этим фрагментом кода: http://www.java2s.com/Code/Java/JDK-6/CompilingfromMemory.htm, и я сделал что-то вроде этого:
private final String = "GeneratedClass_" + Long.toHexString(random.nextLong());
private Method compileCode(String code) {
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
if (compiler == null) return null;
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();
JavaFileObject source = new JavaSource(className, code);
Iterable<? extends JavaFileObject> compilationUnits = Arrays.asList(source);
CompilationTask task = compiler.getTask(null, null, diagnostics, null, null, compilationUnits);
if (!task.call()) return null;
try {
return Class.forName(className).getDeclaredMethods()[0];
} catch (ClassNotFoundException e) {}
return null;
}
private class JavaSource extends SimpleJavaFileObject {
final String code;
JavaSource(String name, String code) {
super(URI.create("string:///" + name.replace('.','/') + Kind.SOURCE.extension),Kind.SOURCE);
this.code = code;
}
@Override
public CharSequence getCharContent(boolean ignoreEncodingErrors) {return code;}
}
Просто представьте, что строковый код - это что-то вроде
"public class GeneratedClass_65ce701239c32ce0 {
public String hello() {
return "Hello, world!";
}
}"
Это работает хорошо до того Class.forName, который выбрасывает ClassNotFoundException.Я озадачен, потому что не похоже, что я вырезал что-то важное из фрагмента: так, класс был скомпилирован, но куда он девался?
Я читал кое-что об использовании другого загрузчика классов, но так какЯ сказал, что я довольно новичок во всем этом, я не знаю, куда идти и как его использовать, и как мне определить свое собственное расширение ClassLoader.Единственное, что я знаю, это то, что мне все кажется довольно сложным ...
Использование Eclipse Indigo в Windows 7 и JDK 1.7.