Java ClassLoader: Klasse ersetzen, die bereits geladen wurde

Doch, weil du eben nicht jede beliebige Funktion (oder sagen wir Funktionsscharen) als Formel übergeben kannst. Aber ich streite mich in dem Punkt auch nicht. Mach das, was dich glücklich macht.

Ok, die Grundlagen mit KI:

Eine Funktion, im mathematischen Sinne, ist eine eindeutige Zuordnung, bei der jedem Element einer Menge (Definitionsmenge) genau ein Element einer anderen Menge (Wertebereich) zugeordnet wird. Anschaulich gesprochen, ist eine Funktion eine Regel, die jeder Eingabe (aus der Definitionsmenge) eine eindeutige Ausgabe (aus dem Wertebereich) zuordnet.
Erläuterung:
Definitionsmenge: Die Menge aller möglichen Eingabewerte für die Funktion.
Wertebereich: Die Menge aller möglichen Ausgabewerte, die durch die Funktion erzeugt werden können.
Eindeutigkeit: Für jeden Wert der Definitionsmenge darf es nur einen einzigen zugehörigen Wert im Wertebereich geben.

Beispielweise gibt es auch Funktionen, die nicht stetig sind, springen oder nicht wohl definiert sind. Oder auch rekursive oder Chaosfunktionen.
 
Mit "Funktion" meine ich Java-Funktionen, also Methoden.

Man kann Java-Methoden auch als Parameter in andere Methoden übergeben.
Du möchtest doch mathematische Funktionen haben, die ein x und ein y aufnehmen, oder? Solange das so ist, ist es überhaupt kein Problem, eine beliebige Methode mit x- und y-Parameter als Parameter in eine Plotting-Methode zu übergeben.
 
Andarkan schrieb:
ist es überhaupt kein Problem, eine beliebige Methode mit x- und y-Parameter als Parameter in eine Plotting-Methode zu übergeben.
Deshalb ja Reflections bzw. der ClassLoader.
Ergänzung ()

@Marco01_809 Es gibt noch ein Problem:

Java:
private static MySupplier 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(), "MySupplierImpl.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("MySupplierImpl.class");
  URLClassLoader classLoader =
URLClassLoader.newInstance(
new URL[] {Objects.requireNonNull(classFile.getParent()).toUri().toURL()},
Main.class.getClassLoader());
 return (MySupplier)
Class.forName("MySupplierImpl", true, classLoader)
.getDeclaredConstructors()[0]
          .newInstance();
}

Java:
public interface MySupplier {
/**
   * Returns the number of series to be generated.
   *
   * @return the number of series
   */
  int numberOfSeries();

/**
   * Returns the title for a specific series.
   *
   * @param seriesIndex the index of the series
   * @return the title of the series
   */
  String getTitle(int seriesIndex);

/**
   * Generates a series of data points for a specific series.
   *
   * @param seriesIndex the index of the series
   * @return a 2D array where each row contains [x, y] values for the series
   */
  double[][] generateSeries(int seriesIndex);
}

Java:
public class MySupplierImpl implements 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
  }
}

compileSupplierCode kann ich leider nur ein einziges Mal aufrufen, danach kommt immer das gleiche Objekt zurück.

Edit: Ah, mit dem RedefineClassLoader, den ich anfangs auskommentiert hatte, geht es endlich.
 
Zuletzt bearbeitet:
Zurück
Oben