के साथ उपयोगकर्ता कोड संकलित और चल रहा है मैं जावा सीखने के लिए वेब ऐप लिख रहा हूं। कौन से उपयोगकर्ता मेरे कोड को अपने कोड पर संकलित कर सकते हैं + उस कोड को चलाएं। संकलन JavaCompiler करना आसान है:JavaCompiler और ClassLoader
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();
CompilationTask task = compiler.getTask(null, null, diagnostics, null, null, prepareFile(nazwa, content));
task.call();
List<String> returnErrors = new ArrayList<String>();
String tmp = new String();
for (Diagnostic diagnostic : diagnostics.getDiagnostics()) {
tmp = String.valueOf(diagnostic.getLineNumber());
tmp += " msg: " + diagnostic.getMessage(null);
returnErrors.add(tmp.replaceAll("\n", " "));
}
मैं कोड के साथ वर्ग लोड करने के लिए प्रबंधन:
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager manager = compiler.getStandardFileManager(null, null, null);
try {
URL[] urls = {new URL("file:///root/"), new URL("file://C:\\serv\\Apache Tomcat 6.0.20\\bin\\")};
ClassLoader cl_old = Thread.currentThread().getContextClassLoader();
ClassLoader cl_new = new URLClassLoader(urls, cl_old);
Class compiledClass = cl_new.loadClass(CLASS_NAME);
Method myMethod = compiledClass.getMethod(METHOD_NAME);
Object tmp = myMethod.invoke(null);
} catch (Exception ex) {
Logger.getLogger(ITaskCompile.class.getName()).log(Level.SEVERE, null, ex);
}
मैं अंतहीन लूप, और बुराई छात्रों से मेरे ऐप की रक्षा कैसे कर सकते हैं;)
- क्या जीवन भर के साथ उस कोड को चलाने का कोई तरीका है?
- मेमोरी लीक के साथ कोई जोखिम है, और मैं इसे ठीक करने के लिए क्या कर सकता हूं।
- यह अच्छा समाधान है, या आप कुछ बेहतर सुझाव दे सकते हैं?
thx। Tzim
+1: लेकिन चेतावनी के साथ कि आप एक सुरक्षा प्रबंधक को सैंड-बॉक्स में छात्र कोड, यहां तक कि उसी JVM में भी उपयोग करने में सक्षम होना चाहिए। लेकिन आप इस नीति का उपयोग करना चाहेंगे: सभी को ब्लॉक करें, फिर चयनित कार्रवाइयों की अनुमति दें। –
Thx। हे सबसे बुरा हिस्सा यह है कि मुझे इसे एक सर्वर के साथ करना होगा। मैं प्रक्रिया का उपयोग करने की कोशिश करूंगा। जवाब देने के लिए धन्यवाद। – tzim