In meinem aktuellen Projekt möchte ich in der Lage sein, eine Lambda-Methode „Reinstanziierung“ (weiß nicht, ob „Reinstanziierung“, obwohl das richtige Wort ist)OpenJDK 8 Lambdas Verarbeitung
Betrachten wir ein Beispiel folgende
public static void main(String[] args) throws Throwable {
TestUser tu = new TestUser();
ITest1 lam = t->{
System.out.println("whoops" + tu.toString());
return 1;
};
tu.doExec(lam);
calls++;
if(calls == 1) main(args);
}
Hier ich habe versucht, durch die JVM Anrufe zu debuggen, und ich bemerkte, dass JVM erstellt und MethodType
und MethodHandle
Objekte für die metafactory Methode (die CallSite
schafft baut) und für meine Lambda-Methode. Sobald dies erledigt ist, wird linkCallSite
aufgerufen. Diese Methode erstellt die CallSite und verknüpft die Lambda-Methode nur einmal mit ihr. An dieser Stelle ist meine Frage, kann ich irgendwie die Lambda CallSite und LambdaForm von der jvm löschen und irgendwie den ganzen Prozess wieder auslösen?
Und eine andere Frage, wenn sie durch die JVM Debuggen ruft ich, dass jedes Mal bemerkt, wenn JVM die Lambda-Methode ausgeführt wird, ein Verfahren Ljava/lang/invoke/LambdaForm$MH/818403870;.linkToTargetMethod(Object)
aufgerufen wird, die ich nicht Source, weder in JVM cpp Quellen finden können, noch in Java. Wie genau wird diese Methode aufgerufen oder wo wird sie aufgerufen?
Ich weiß, die Frage ist irgendwie kompliziert, also bin ich offen für Ihre Fragen. Vielen Dank im Voraus.
was meinst du mit "instantiate" ?? –
@ ΦXocê 웃 Пepeúpa ツ Ich möchte die LamdaForms und CallSite aus dem jvm löschen, damit jvm das gesamte Instanziierungsverfahren erneut durchführen muss ... –
hast du versucht, die betreffende Klasse unter einem anderen Klassenlader zu laden? – the8472