Java, lire le contenu d'un fichier et le mettre comme une classe

Signaler
-
Messages postés
16256
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
27 février 2021
-
Bonjour,
Je travail sur un projet en java et je voudrai savoir si c'est possible de lire le contenu d'un fichier héberger sur web et définir son contenu comme étant une classe, la compiler et l'exécuter.
Merci d'avance

1 réponse

Messages postés
16256
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
27 février 2021
2 799
Bonjour,

Théoriquement, c'est possible. Mais en pratique il y a beaucoup de limitations au code que tu pourras réellement manipulé de cette manière.

Pour l'exemple j'utilise le code HelloWorldApp qui est hébergé ici : https://docs.oracle.com/javase/tutorial/getStarted/application/examples/HelloWorldApp.java

import java.lang.reflect.Method;
import java.net.*;
import java.net.http.*;
import java.net.http.HttpResponse.BodyHandlers;
import java.nio.file.*;
import javax.tools.*;

public class Application {
    public static void main(String[] args) throws Exception {
        String codeUrl = "https://docs.oracle.com/javase/tutorial/getStarted/application/examples/HelloWorldApp.java";
        String className = "HelloWorldApp";

        System.out.println("# Création d'un répertoire temporaire");
        Path dir = Files.createTempDirectory("javac-").toAbsolutePath();
        System.out.println(dir);

        System.out.println("# Téléchargement du code : " + codeUrl);
        HttpClient client = HttpClient.newBuilder().build();
        HttpRequest request = HttpRequest.newBuilder(new URI(codeUrl)).build();
        HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
        System.out.println("# Résultat du téléchargement : " + response.statusCode());
        String code = response.body();
        System.out.println(code);

        System.out.println("# Enregistrement du code " + className );
        Path javaFile = Files.writeString(Paths.get(dir.toString(), className + ".java"), code).toAbsolutePath();

        System.out.println("# Compilation du code " + className);
        JavaCompiler javac = ToolProvider.getSystemJavaCompiler();
        int n = javac.run(null, null, null, javaFile.toString());
        System.out.println("# Résultat de la compilation : " + n);

        System.out.println("# Chargement de la classe " + className);
        URLClassLoader classLoader = new URLClassLoader(new URL[] { dir.toUri().toURL() });
        Class<?> mainClass = classLoader.loadClass(className);

        System.out.println("# Récupération de la méthode main");
        Method method = mainClass.getMethod("main", String[].class);
        method.setAccessible(true);

        System.out.println("# Exécution de la méthode main");
        method.invoke(null, (Object) null);

        System.out.println("# Fin du programme");
        classLoader.close();
    }
}

Le résultat est un "Hello World!" qui s'affiche correctement.
# Création d'un répertoire temporaire
C:\Users\KX\AppData\Local\Temp\javac-12345678987654321
# Téléchargement du code : https://docs.oracle.com/javase/tutorial/getStarted/application/examples/HelloWorldApp.java
# Résultat du téléchargement : 200
class HelloWorldApp {
    public static void main(String[] args) {
        System.out.println("Hello World!"); // Display the string.
    }
}
# Enregistrement du code HelloWorldApp
# Compilation du code HelloWorldApp
# Résultat de la compilation : 0
# Chargement de la classe HelloWorldApp
# Récupération de la méthode main
# Exécution de la méthode main
Hello World!
# Fin du programme