Hallo, ich wollte fragen, ob man eine bestehende Klasse, die schon einmal vom System Class Loader geladen wurde, dynamisch durch eine andere ersetzen kann, oder ob das Java Sicherheitsmodell dies verhindert:
Ich kann zwar das geladene Objekt (das Ergebnis von
Wenn ihr eine Idee habt, würde ich mich freuen.
Java:
private static Object compileSupplierCode(String codeText) throws Exception {
// Save the code to a temporary file and compile it
Path parentDir = Paths.get("temp");
try (Stream<Path> paths = Files.walk(parentDir)) {
paths.sorted(Comparator.reverseOrder()).map(Path::toFile).forEach(File::delete);
}
Files.createDirectories(parentDir);
Path tempFile = Paths.get(parentDir.toString(), "MySupplier.java");
Files.writeString(tempFile, codeText);
JavaCompiler jc = javax.tools.ToolProvider.getSystemJavaCompiler();
jc.run(null, null, null, tempFile.toFile().getAbsolutePath());
Path classFile = Objects.requireNonNull(tempFile.getParent()).resolve("MySupplier.class");
URLClassLoader classLoader =
URLClassLoader.newInstance(
new URL[] {Objects.requireNonNull(classFile.getParent()).toUri().toURL()}, null);
// ClassLoader redefineClassLoader =
// new ClassLoader() {
// @Override
// public Class<?> loadClass(String name) throws ClassNotFoundException {
// if (name.equals("MySupplier")) {
// try {
// byte[] buf = Files.readAllBytes(classFile);
// int len = buf.length;
// return defineClass(name, buf, 0, len);
// } catch (IOException e) {
// throw new ClassNotFoundException("", e);
// }
// }
// return getParent().loadClass(name);
// }
// };
return Class.forName("MySupplier", true, classLoader)
.getDeclaredConstructors()[0]
.newInstance();
}
Ich kann zwar das geladene Objekt (das Ergebnis von
Class.forName ...) mittels Reflection verwenden, aber wenn ich versuche, es nach MySupplier zu casten, kracht es, weil es diese Klasse bereits gibt:
Java:
public class MySupplier {
public int numberOfSeries() {
return 2; // Return the number of series to be generated
}
public String getTitle(int seriesIndex) {
return "Series " + (seriesIndex + 1); // Return a title for each series
}
public double[][] generateSeries(int seriesIndex) {
double[][] series = new double[10][2];
double a = seriesIndex * 10; // Example coefficient based on series index
for (int i = 0; i < series.length; i++) {
double y = f(i, a);
series[i][0] = i; // x value
series[i][1] = y; // y value based on the function
}
return series;
}
private double f(double x, double a) {
return x * x * a; // Example function
}
}
Wenn ihr eine Idee habt, würde ich mich freuen.