2010-01-28 6 views
4

Existe-t-il un moyen d'exécuter un programme compilé par JavaCompiler? [Javax.tools.JavaCompiler]comment exécuter le code compilé par JavaCompiler?

Mon code:

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", " ")); 
    } 

Maintenant, je veux exécuter ce programme à durée de vie 1 sec et obtenir une sortie à la variable de chaîne. Est-ce que je pourrais faire ça?

Répondre

5

Vous devez utiliser la réflexion, quelque chose comme ça:

// Obtain a class loader for the compiled classes 
ClassLoader cl = fileManager.getClassLoader(CLASS_OUTPUT); 
// Load the compiled class 
Class compiledClass = cl.loadClass(CLASS_NAME); 
// Find the eval method 
Method myMethod = compiledClass.getMethod("myMethod"); 
// Invoke it 
return myMethod.invoke(null); 

bien sûr l'adapter à vos besoins

+0

Mais qu'en est-il de la durée de vie d'un programme? J'ai utilisé cela dans mon application Web. C'est une application web basée sur le printemps pour apprendre Java. Si l'étudiant fait une boucle sans fin ... – tzim

+0

Sécuriser une application comme celle-là est une très bonne question, mais c'est aussi une question très différente. –

1

Vous devez ajouter la classe compilée au classpath actuelle.

Il existe plusieurs façons de le faire, en fonction de la configuration de votre projet. Voici un exemple en utilisant java.net.URLClassLoader:

ClassLoader cl_old = Thread.currentThread().getContextClassLoader(); 
ClassLoader cl_new = new URLClassLoader(urls.toArray(new URL[0]), cl_old); 

où « urls » est une liste des urls pointant vers le système de fichiers.

Questions connexes