Comment puis-je charger une Classe Java qui n'est pas compilé?
Vous avez besoin de le compiler en premier. Cela peut être fait par programmation avec la javax.les outils de l'API. Cela nécessite seulement le JDK installé sur la machine locale sur le dessus de la JRE.
Voici une base de lancement pour exemple (en laissant exception évidente de la manipulation de côté):
// Prepare source somehow.
String source = "package test; public class Test { static { System.out.println(\"hello\"); } public Test() { System.out.println(\"world\"); } }";
// Save source in .java file.
File root = new File("/java"); // On Windows running on C:\, this is C:\java.
File sourceFile = new File(root, "test/Test.java");
sourceFile.getParentFile().mkdirs();
new FileWriter(sourceFile).append(source).close();
// Compile source file.
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
compiler.run(null, null, null, sourceFile.getPath());
// Load and instantiate compiled class.
URLClassLoader classLoader = URLClassLoader.newInstance(new URL[] { root.toURI().toURL() });
Class<?> cls = Class.forName("test.Test", true, classLoader); // Should print "hello".
Object instance = cls.newInstance(); // Should print "world".
System.out.println(instance); // Should print "test.Test@hashcode".
Ce qui donne comme
hello
world
test.Test@ab853b
Autre utilisation serait plus facile si ces classes implements
une certaine interface qui est déjà dans le classpath.
SomeInterface instance = (SomeInterface) cls.newInstance();
Sinon, vous devez faire appel à la Réflexion de l'API d'accès et d'invoquer l' (inconnu) les méthodes et les champs.
Cela dit, et sans lien avec le réel problème:
properties.load(new FileInputStream(new File("ClassName.properties")));
Laisser java.io.File
s'appuyer sur le répertoire de travail courant est la recette pour la portabilité de la difficulté. Ne pas le faire. Mettre ce fichier dans le classpath et utiliser ClassLoader#getResourceAsStream()
avec un classpath-chemin d'accès relatif.
properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("ClassName.properties"));