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

Fermé
Damitoliko - 10 févr. 2021 à 23:25
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 11 févr. 2021 à 14:44
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
A voir également:

1 réponse

KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
11 févr. 2021 à 14:44
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
0