1. Der bedingten Switch-Anweisung können Zeichenfolgen hinzugefügt werden. Die Methode besteht darin, den Hashcode () -Wert der Zeichenfolge zu verwenden, um den tatsächlichen Wert zu erhalten.
2. Ein Basissystem hinzugefügt, das in binären Literalen verwendet werden kann, indem „0b“ oder „0B“ vor der Zahl hinzugefügt wird.
3. Verwenden Sie Unterstriche in numerischen Literalen, um Zahlen zur leichteren Lesbarkeit zu trennen, ohne die Größe des Werts zu beeinträchtigen. Das Grundprinzip besteht darin, dass Unterstriche nur dann erscheinen können, wenn Zahlen davor und danach stehen.
4.java7 hat zwei Änderungen an Ausnahmen vorgenommen:
4.1. Unterstützt das gleichzeitige Abfangen mehrerer Ausnahmen in einer Catch-Klausel und dient zum anderen dazu, den Ausnahmetyp beim Abfangen und erneuten Auslösen von Ausnahmen präziser zu gestalten. Die addSuppressed-Methode wurde in Java 7 zur Throwable-Klasse hinzugefügt. Wenn eine Ausnahme ausgelöst wird, werden möglicherweise andere Ausnahmen aufgrund der Ausnahme unterdrückt und können daher nicht normal ausgelöst werden. Zu diesem Zeitpunkt können Sie diese unterdrückten Methoden über die Methode addSuppressed aufzeichnen. Die unterdrückten Ausnahmen werden in den Stapelinformationen der ausgelösten Ausnahmen angezeigt. Sie können diese Ausnahmen auch über die Methode getSuppressed abrufen. Dies hat den Vorteil, dass keine Ausnahmen verloren gehen, was den Entwicklern das Testen erleichtert.
Java7 verbessert die Syntax der Catch-Klausel und ermöglicht die Angabe mehrerer Ausnahmen. Jeder Ausnahmetyp wird durch „|“ getrennt. Es ist zu beachten, dass die in der Catch-Klausel erfassten Ausnahmen keine wiederholten Typen haben dürfen und dass eine der Ausnahmen auch keine Unterklasse eines anderen Ausnahmeparameters sein darf, da sonst ein Kompilierungsfehler auftritt (von Klein- zu Großbuchstaben gibt es kein Problem). ). Wenn in der Catch-Klausel mehrere Ausnahmen deklariert sind, ist der spezifische Typ des Ausnahmeparameters die minimale Obergrenze aller dieser Ausnahmetypen.
4.2 Verwenden Sie try (Ressourcenanwendung) {Geschäftsverarbeitung}, um Ressourcen automatisch freizugeben. Ressourcen, die durch Try-Anweisungen verwaltet werden können, müssen eine Bedingung erfüllen, das heißt, ihre Java-Klasse muss die Schnittstelle java.lang.AutoCloseable implementieren, andernfalls tritt ein Kompilierungsfehler auf wird auftreten. Die Close-Methode dieser Schnittstelle wird automatisch aufgerufen, wenn Ressourcen freigegeben werden müssen.
5. Optimieren Sie Methodenaufrufe mit Parametern variabler Länge:
Eine neue Funktion, die in j2se5.0 eingeführt wurde, besteht darin, die Verwendung von Parametern variabler Länge in Methodendeklarationen zu ermöglichen. Der letzte formale Parameter einer Methode kann so angegeben werden, dass er eine beliebige Anzahl von Parametern desselben Typs darstellt. Beim Aufruf werden diese Parameter in Form eines Arrays übergeben. Diese Parameter können auch als Arrays im Methodenkörper referenziert werden.
6. Java 7 führt eine neue Annotation @SafeVarargs ein. Wenn der Entwickler sicher ist, dass eine Methode, die Parameter variabler Länge verwendet, bei Verwendung mit einer generischen Klasse keine ähnliche Situation verursacht, kann sie mit dieser Annotation deklariert werden. Die Annotation @SafeVarargs kann nur für Methoden oder Konstruktoren mit variablen Parameterlängen verwendet werden, und die Methode muss als statisch oder final deklariert werden, andernfalls tritt ein Kompilierungsfehler auf. Voraussetzung für die Annotation einer Methode mit @SafeVarargs ist, dass der Entwickler sicherstellen muss, dass die Verarbeitung generischer Typparameter bei der Implementierung dieser Methode keine Probleme mit der Typsicherheit verursacht.
7. Java unterstützt einige Skriptsprachen in der Java Virtual Machine über die Skript-Engine. Tatsächlich unterstützt der Script Engine Manager drei Suchmaschinenmethoden, die durch Name, Dateierweiterung und MIME-Typ vervollständigt werden. wie
7.1 Sprachbindung:
Ein großer Vorteil der API zur Unterstützung der Skriptsprache besteht darin, dass sie die Interaktion zwischen der Java-Sprache und der Skriptsprache standardisiert, sodass in der Java-Sprache geschriebene Programme bidirektionale Methodenaufrufe und Datenübertragungen mit Skripten durchführen können. Die Datenübertragung erfolgt über Sprachbindungsobjekte. Das sogenannte Sprachbindungsobjekt ist eine einfache Hash-Tabelle, die zum Speichern und Abrufen von Daten verwendet wird, die gemeinsam genutzt werden müssen. Alle Daten entsprechen einem Eintrag in dieser Hash-Tabelle und sind ein einfaches Name-Wert-Paar. Die Schnittstelle javax.script.Bingings definiert die Schnittstelle von Sprachbindungsobjekten, die von der Schnittstelle java.util.Map erbt. Eine Skript-Engine kann während der Ausführung mehrere Sprachbindungsobjekte verwenden. Verschiedene Sprachen haben unterschiedliche Bereiche zum Binden von Objekten. Standardmäßig stellt die Skript-Engine mehrere Sprachbindungsobjekte bereit, um während der Ausführung generierte globale Objekte zu speichern. Die ScriptEnging-Klasse stellt Put- und Get-Methoden bereit, um die standardmäßigen Sprachbindungsobjekte zu bearbeiten, die speziell in der Skript-Engine verwendet werden. Programme können dieses Standard-Sprachbindungsobjekt direkt oder ihre eigenen Sprachbindungsobjekte verwenden. Während der Skriptausführung kann das Sprachbindungsobjekt als zusätzliche Variablenzuordnungstabelle betrachtet werden. Namen in Sprachbindungsobjekten werden beim Parsen von Variablenwerten ebenfalls berücksichtigt. Globale Variablen und andere Inhalte, die während der Skriptausführung generiert werden, werden im Sprachbindungsobjekt angezeigt. Auf diese Weise wird die bidirektionale Datenübertragung zwischen Java und der Skriptsprache abgeschlossen.
Beispielsweise wird über die put-Methode von ScriptEngine eine Zeichenfolge mit dem Namen „name“ zum Standardsprachbindungsobjekt der Skript-Engine hinzugefügt, und dann wird im Skript direkt über den Namen auf das Objekt verwiesen. Ebenso kann die im Skript erstellte globale Variable „message“ auch über die get-Methode von ScriptEnging abgerufen werden. Dadurch wird eine bidirektionale Datenübertragung zwischen Java-Programmen und Skripten erreicht. Die Typkonvertierung während der Datenübertragung wird von der Skript-Engine durchgeführt, und die Konvertierungsregeln hängen von der Grammatik der jeweiligen Sprache ab.
In den meisten Fällen ist die Verwendung der Put- und Get-Methoden von ScriptEnging ausreichend. Wenn nur die Methoden put und get verwendet werden, ist das Sprachbindungsobjekt selbst für den Entwickler transparent. In einigen Fällen ist es notwendig, das programmeigene Sprachbindungsobjekt zu verwenden. Beispielsweise enthält das Sprachbindungsobjekt die eigenen eindeutigen Daten des Programms. Wenn Sie Ihr eigenes Sprachbindungsobjekt verwenden möchten, können Sie die creatBingings-Methode der Skript-Engine aufrufen oder ein javax.script.SimpleBingings-Objekt erstellen und es an die eval-Methode der Skript-Engine übergeben, z. B.:
Das über die Eval-Methode übergebene Sprachbindungsobjekt wird nur im aktuellen Eval-Aufruf wirksam und ändert nicht das Standard-Sprachbindungsobjekt der Engine.
7.2 Skriptausführungskontext Eine weitere wichtige Schnittstelle im Zusammenhang mit der Ausführung der Skript-Engine ist javax.script.ScriptContext, die relevante Kontextinformationen während der Ausführung der Skript-Engine enthält. Sie kann mit der Schnittstelle javax.servlet.ServletContext in der Servlet-Spezifikation in JavaEE verglichen werden . . Die Skript-Engine erhält Informationen zur Skriptausführung durch Verweis auf das Kontextobjekt und ermöglicht Entwicklern außerdem, das Verhalten der Skript-Engine über dieses Objekt zu konfigurieren. Die oberen und unteren Objekte enthalten hauptsächlich die folgenden drei Arten von Informationen.
7.2.1 Eingabe und Ausgabe Zunächst werden die Konfigurationsinformationen im Zusammenhang mit der Skripteingabe und -ausgabe vorgestellt, einschließlich des java.io.Reader-Objekts, das vom Skript zum Lesen der Dateneingabe während der Ausführung verwendet wird, und des java.io.Writer, der korrekte Inhalte ausgibt und Fehlerinformationen. Standardmäßig erfolgen die Eingabe und Ausgabe des Skripts in der Standardkonsole. Wenn Sie die Ausgabe des Skripts in eine Datei schreiben möchten, können Sie den folgenden Code verwenden. Leiten Sie die Ausgabe des Skripts über die setWriter-Methode in eine Datei um. Über die Methoden setReader und setErrorWriter von ScriptContext können Sie jeweils die Dateneingabequelle festlegen, wenn das Skript ausgeführt wird, und das Ausgabeziel der Fehlermeldung festlegen, wenn ein Fehler auftritt.
7.2.2 Benutzerdefinierte Eigenschaften
ScriptContext verfügt auch über Methoden zum Abrufen und Festlegen von Attributen, die denen in ServletContext ähneln, nämlich setAttribute und getAttribute. Der Unterschied besteht darin, dass die Attribute in ScriptContext einen Gültigkeitsbereich haben. Der Unterschied zwischen verschiedenen Bereichen ist die Suchreihenfolge. Jeder Bereich verwendet eine entsprechende Ganzzahl, um seine Suchreihenfolge darzustellen. Je kleiner der ganzzahlige Wert ist, desto höher ist die Priorität in der Suchreihenfolge. Eigenschaften in einem Bereich mit höherer Priorität verbergen Eigenschaften mit demselben Namen in einem Bereich mit niedrigerer Priorität. Daher müssen Sie den Bereich beim Festlegen von Eigenschaften explizit angeben. Beim Abrufen von Attributen können Sie die Suche in einem bestimmten Bereich oder die automatische Suche basierend auf der Bereichspriorität auswählen.
Der in der Implementierung des Skriptausführungskontexts enthaltene Umfang ist jedoch festgelegt. Es steht Entwicklern nicht frei, ihren eigenen Umfang zu definieren. Eine Liste aller verfügbaren Bereiche kann über die getScopes-Methode von ScriptContext abgerufen werden. In SciptContext sind zwei Bereiche vordefiniert: Der durch die Konstante ScriptContext.ENGINE_SCOPE dargestellte Bereich entspricht der aktuellen Skript-Engine, und der durch ScriptContext.GLOBAL_SCOPE dargestellte Bereich entspricht allen Skript-Engine-Objekten, die von derselben Engine-Factory erstellt wurden. Ersteres hat höhere Priorität. Zum Beispiel:
7.2.3 Sprachbindungsobjekte
Der letzte Informationstyp im Skriptausführungskontext ist das Sprachbindungsobjekt. Sprachbindungsobjekte entsprechen ebenfalls Bereichen. Die gleiche Reihenfolge der Bereichspriorität gilt für sprachgebundene Objekte. Diese Prioritätsreihenfolge wirkt sich auf die Variablenauflösung während der Skriptausführung aus. Zum Beispiel:
bindings.put("name","World")
engine.eval("println(name);");
7.3 Zusammenstellung von Skripten:
Skriptsprachen werden im Allgemeinen interpretiert und ausgeführt. Die Skript-Engine muss das Skript analysieren, bevor sie es zur Laufzeit ausführt. Im Allgemeinen ist die Ausführung eines Skripts durch Interpretation langsamer als die Ausführung nach der Kompilierung. Wenn ein Skript mehrmals ausgeführt werden muss, kann das Skript zuerst kompiliert werden. Das kompilierte Skript muss bei der Ausführung nicht wiederholt analysiert werden, was die Ausführungseffizienz verbessern kann. Nicht alle Skript-Engines unterstützen die Kompilierung von Skripten. Wenn eine Skript-Engine diese Funktion unterstützt, implementiert sie die Schnittstelle javax.script.Compilable, um dies zu deklarieren. Benutzer von Skript-Engines können diese Funktion nutzen, um die Effizienz von Skripten zu verbessern, die mehrmals ausgeführt werden müssen. Die mit Java SE gelieferte JavaScript-Skript-Engine unterstützt das Kompilieren von Skripten.
Im folgenden Code wird die Kompilierungsmethode der Compilable-Schnittstelle zum Kompilieren des Skriptcodes verwendet, und das Kompilierungsergebnis wird durch javax.script.CompiledScript dargestellt. Da nicht alle Skript-Engines die Compilable-Schnittstelle unterstützen, muss hier die Instanz von „instanceof“ zur Beurteilung herangezogen werden. In der Run-Methode kann das Skript über die Eval-Methode von CompiledScript ausgeführt werden. Im Code wird ein Skript 100 Mal wiederholt ausgeführt, um den Leistungsvorteil des kompilierten Skripts bei wiederholter Ausführung zu veranschaulichen.
public void run(String scriptText) löst eine ScriptException {
CompiledScript script = kompilieren(scriptText);
if (script == null) {
zurückkehren;
}
for (int i = 0; i < 100; i++) {
script.eval();
}
}
7.4 Methodenaufrufe in Skripten In Skripten sind Methoden die gebräuchlichsten und praktischsten. Bei einigen Skript-Engines können Benutzer eine Methode in einem Skript einzeln aufrufen. Skript-Engines, die diesen Methodenaufruf unterstützen, können die javax.script.Invocable-Schnittstelle implementieren. Über die Invocable-Schnittstelle können Sie Methoden der obersten Ebene in Skripten und Mitgliedsmethoden in Objekten aufrufen. Wenn die Methode der obersten Ebene im Skript oder die Mitgliedsmethode im Objekt die Schnittstelle in Java implementiert, können Sie das Implementierungsobjekt der entsprechenden Java-Schnittstelle im Skript über die Methode in der invocable-Schnittstelle abrufen. Auf diese Weise kann die Schnittstelle in der Java-Sprache definiert und im Skript implementiert werden. Andere Teile des Programms, die die Schnittstelle verwenden, wissen nicht, dass die Schnittstelle vom Skript implementiert wird. Wie die Compilable-Schnittstelle ist auch die Implementierung der Invocable-Schnittstelle durch ScriptEngine optional.
Der folgende Code ruft die Methode der obersten Ebene im Skript über die invokeFunction der Invocable-Schnittstelle auf. Die Parameter werden während des Aufrufs an die Methode im Skript übergeben. Da die mit JavaSE gelieferte JavaScript-Skript-Engine die Invocable-Schnittstelle implementiert, wird hier auf die Beurteilung, ob die Engine die Invocalbe-Schnittstelle implementiert, verzichtet. Ein Beispiel für den Aufruf der Top-Level-Methode des Skripts in Java:
//Beispiel für den Aufruf von Mitgliedsmethoden eines Skriptobjekts in Java
7.5 Java-Schnittstelle im Skript implementieren
In einigen Skript-Engines kann die Schnittstelle in der Java-Sprache definiert und die Implementierung der Schnittstelle im Skript geschrieben werden. Auf diese Weise können andere Teile des Programms nur mit der Java-Schnittstelle interagieren und müssen sich nicht darum kümmern wie die Schnittstelle implementiert ist. Im folgenden Code ist Greet eine in Java definierte Schnittstelle, die eine getGreeting-Methode enthält. Implementieren Sie diese Schnittstelle im Skript. Über die Methode getInterface können Sie das Objekt der vom Skript implementierten Schnittstelle abrufen und die darin enthaltenen Methoden aufrufen.
Da die Syntax der Skriptsprache einfach und flexibel ist, eignet sie sich sehr gut für Benutzer ohne oder mit nur geringen Programmierkenntnissen. Diese Benutzer können die Skriptsprache verwenden, um die Geschäftslogik und die Benutzeroberfläche des Skripts anzupassen Sprache kann die Benutzerfreundlichkeit des Programms verbessern. Es wird ein besseres Gleichgewicht zwischen Flexibilität und Flexibilität erreicht. Beispielsweise wird die Skriptsprache Lua häufig in der Spieleentwicklung verwendet, um das interne Verhalten und die Benutzeroberfläche des Spiels anzupassen.
8. Die Reflection-API bringt zwar Flexibilität in Java-Programme, verursacht aber auch zusätzliche Leistungskosten. Aufgrund des Implementierungsmechanismus der Reflection-API ist die Verwendung der Reflection-API zur dynamischen Implementierung für denselben Vorgang, z. B. das Aufrufen einer Methode, schneller als es direkt in der Quelle auszuführen. Die Art und Weise, wie der Code geschrieben wird, ist wahrscheinlich ein bis zwei Größenordnungen langsamer. Mit der Verbesserung der Java Virtual Machine-Implementierung wurde die Leistung der Reflection API erheblich verbessert. Diese Leistungslücke besteht jedoch objektiv. Daher sollten Reflexions-APIs in einigen Anwendungen mit relativ hohen Leistungsanforderungen mit Vorsicht verwendet werden.