Der Hauptgrund wie in Ihrem Fall, wenn ein publicLookup
:
StringConcatFactory.makeConcat(MethodHandles.publicLookup(), "abc", MethodType.methodType(String.class));
ein StringConcatException
während auf der anderen Seite werfen, die lookup
StringConcatFactory.makeConcat(MethodHandles.lookup(), "abc", MethodType.methodType(String.class));
fein funktionieren würde, ist, wenn die Methode verwendet, erstellt Griff Greifen Sie auf private Mitglieder einer Klasse einer privaten Klasse eines Pakets zu.
Wie in der auch von @GhostCat verbunden Javadoc of publicLookup angegeben
publicLookup => PUBLIC_LOOKUP => (PUBLIC|UNCONDITIONAL) modes
Gibt ein Lookup-Objekt, das minimal vertrauenswürdig ist. Die Suche hat die PUBLIC
und UNCONDITIONAL modes
. Es kann nur verwendet werden, um die Methode Handles für öffentliche Mitglieder der öffentlichen Klassen in Paketen zu erstellen, die bedingungslos exportiert werden.
während für ein lookup
lookup => (lookupClass => Reflection.getCallerClass, FULL_POWER_MODES => (ALL_MODES & ~UNCONDITIONAL))
Gibt ein Lookup-Objekt mit vollen Fähigkeiten all unterstütztes Bytecode Verhalten des Anrufers zu emulieren. Diese Funktionen umfassen privaten Zugriff auf den Aufrufer. Factory-Methoden für das Suchobjekt können direkte Methodenhandles für jedes Mitglied erstellen, auf das der Aufrufer über Bytecodes zugreifen kann, einschließlich geschützter und privater Felder und Methoden. Dieses Nachschlageobjekt ist eine Funktion, die an vertrauenswürdige Agenten delegiert werden kann.
Speichern Sie es nicht dort, wo nicht vertrauenswürdiger Code darauf zugreifen kann. Diese Methode ist aufruferempfindlich, was bedeutet, dass sie verschiedene Werte an verschiedene Anrufer zurücksenden kann .
Für jede gegebenen Anrufer Klasse C, das Objekt-Lookup durch diesen Aufruf zurückgegeben hat äquivalente Funktionen zu jedem Objekt lookup durch die JVM geliefert an die Bootstrap-Methode einer invokedynamic Anweisung in die gleiche Aufrufer Klasse C. Ausführung
java9 ist Beta-Status. bitte fragen Sie bei Oracle, ob das ein Fehler ist – Jens
Wie meine Antwort zeigt: Sie möchten wahrscheinlich eine [MCVE] aufstellen. Sie sollten hier mindestens die Ablaufverfolgung für den Ausnahme-Stack angeben. – GhostCat
Was ist 'concatType' für Ihren Code? und welche Ausnahme bekommst du? – nullpointer