Der Changeset: http://hg.openjdk.java.net/jdk8/jdk8/jdk/rev/bff9db7ca352. Dürfte für die meisten von uns so ziemlich egal sein. Im Detail: http://www.unicode.org/versions/Unicode6.2.0/.
Autor: Christian Ullenboom
Java 8 Linksammlung aktualisiert
http://www.tutego.de/java/java-8-opendjk-8-java-se-8.html
Fehlt noch was?
Default-Methoden-Syntax in Java 8 ändert sich
Aus
void foo() default { }
wird
default void foo() { }
Java bekommt unchecked IO-Ausnahmen und BufferedReader.lines()
Die neue Methode BuferedReader lines() liefert ein Stream von Strings, die mit den Bulk-Methoden der Lambda-Bibliothek verarbeitet werden können. Brian Goetz gibt unter http://mail.openjdk.java.net/pipermail/lambda-dev/2012-November/006545.html ein (nicht ganz fehlerfreies) Beispiel:
try (reader = new BR(new FR(file))) {
reader.lines()
.filter(e -> !startsWith("#"))
.map(e -> e.toUpperCase())
.forEach(...);
}
Der Changeset: ttp://hg.openjdk.java.net/lambda/lambda/jdk/rev/94d64473e8e6
Wie kann ein Java-Compiler in Java implementiert sein?
Der Java-Compiler von Oracle und der Java-Compiler der Entwicklungsumgebung Eclipse sind selbst in Java implementiert und generieren diesen Bytecode (es gibt aber auch Java-Compiler in C++, wie den Jikes-Compiler. Natürlich gibt es da ein Henne-Ein-Problem: wie sollte ein neuer in Java geschriebener Compiler durch Java übersetzt werden? Daher entsteht der erste Compiler immer in einer anderen Sprache, und die übersetzt eine kleine Teilmenge der Zielsprache, und dann wird ein neuer Compiler in der Minisprache entwickelt. Im nächsten Schritt wachsen und vergrößern sich Grammatik und Compiler. In der Sprache der Compilerbauer heißt der Prozess Bootstrapping. Bei Java war das ein Prozess über mehrere Stufen. Patrick Naughton schreibt im Buch The Java handbook dazu: “Arthur van Hoff rewrote the compiler in Oak itself, replacing the C version that James originally wrote.“
Thema der Woche: Thread-Kooperation und Benachrichtigung; Schere, Papier, Stein
Zwei Threads sollen auf ein Signal warten, das von einem dritten Threads jede Sekunde gesendet wird. Kommt das Signal, soll sich der erste und zweite Thread zufällig für Schere, Papier oder Stein entscheiden.
- Welche Klassen und Datenstrukturen helfen bei der Lösung?
- Wer wertet bei dem kleinen Spiel aus, wer gewonnen hat? Muss es hier eine weitere Benachrichtigung geben?
- Implementiere eine Lösung.
Offtopic: tutego sucht freiberufliche Trainer
tutego sucht freiberufliche Trainer mit Kenntnissen aus folgenden Gebieten:
- Java: Java EE-Experten (EJB 3, JPA, Hibernate), Liferay, JBI/Open ESB, Java Security, Java+CORBA, Grails, JBoss Portal, Struts2, IceFaces, NetBeans RCP, GlassFish und Oracle BEA Administration, Java ME, Vaadin, Android Programmierung und Android OS
- Datenbanken: Clustering unter Oracle und DB2, Data-Warehouse, OLAP
- Integration: XML-Signaturen und Verschlüsselung
- Betriebssysteme: Administration und Konfiguration von Unix- (Solaris) und Windows-Systemen, Linux (Ubuntu, Suse, Red Hat/RHEL, …), z/OS, Novell
- Server: Open-Xchange, Asterisk, OpenLDAP, LAMP-Aufbau, Virtualisierung (Xen, …)
- Netzwerk/Security: Firewalls, Cisco, Check Point, Netzwerkdesign-/diagnose
- Programmiersprachen und Bibliotheken: C++, STL, Boost, Threading, Delphi/Delphi.NET, COBOL, Qt, GTK+, Assembler
- Content Management Systeme: Typo3, Zope/Plone, Mamboo
- SAP: SAP-Module
- Im Office-Bereich sind wir schon gut bestückt.
Wir erwarten Menschen mit sicherem Auftreten und mehrjähriger Berufserfahrung, die ein hohes Maß an Eigeninitiative, Organisationstalent, Verantwortung und Teamfähigkeit mitbringen und aktiv in der Community teilnehmen.
Sie erweitern Ihr Wissen ständig in der Praxis und können idealerweise Veröffentlichungen vorweisen. Ihr Einsatzort ist der gesamte deutschsprachige Raum.
Es macht Ihnen Spaß Vorträge zu halten und zu unterrichten? Sie sind schnell begeistert, wenn es um die Anwendung neuer Technologien geht? Dann sind Sie bei tutego genau richtig! Wir freuen uns auf Ihre Bewerbung per E-Mail unter info at tutego dot com.
Tiefe Objektkopien mit JAXB und JAXBSource
Die unmarshal(…)-Methoden ist überladen mit Parametern, die typische Datenquellen repräsentieren, etwa Dateien oder Eingabeströme wie ein Reader. Allerdings sind noch andere Parametertypen interessant, und es lohnt sich, hier einmal in die API-Dokumentation zu schauen. Ein spannender Typ ist javax.xml.transform.Source, beziehungsweise die Implementierung der Schnittstelle durch JAXBSource. JAXBSource ist die Quelle, aus denen JAXB seine Informationen bezieht, um ein neues Java-Objekt zu rekonstruieren.
Das nächste Beispiel nimmt sich ein Objekt room als Basis und erzeugt eine tiefe Kopie davon:
Room room = …
JAXBContext context = JAXBContext.newInstance( Room.class );
Unmarshaller unmarshaller = context.createUnmarshaller();
JAXBSource source = new JAXBSource( context, room );
Room copiedRoom = Room.class.cast( unmarshaller.unmarshal( source ) );
System.out.println( copiedRoom.getPlayers() ); // [com.tutego.insel.xml.jaxb.Player@…]
Das Beispiel zeigt somit, wie sich mit Hilfe von JAXB Objektkopien erzeugen lassen.
In Java 8 wird der XML-Import/Export Algorithmus der Properties-Klasse austauschbar
Wie funktioniert eigentlich invokedynamic?
Bei invokedynamic sind viel weniger Typinformationen nötig wie bei den anderen vier existierenden Bytecodes für Methodenaufrufe. Generiert wird der Bytecode zum Beispiel von Skriptsprachen, wenn Typinformationen fehlen. Die Compiler der Skriptsprachen nutzen Bytecode-Bibliotheken wie ASM (http://asm.ow2.org/) und umgehen den Java-Compiler zur Erstellung der Klassendateien.
Der neue Bytecode ist die eine Seite. Aber wenn die Typinformationen fehlen, insbesondere der wichtige Empfänger (wie PrintStream bei println()), wie kommt die JVM zur wirklichen Implementierung? Etwa bei unserem Beispiel von isEmpty(s), in dem es ein invokedynamic-Aufruf von s.length() gibt. Der Aufruf muss ja irgendwo landen.
function isEmpty(s) { return s == null || s.length() == 0; }
Zwei Dinge sind hier zusätzlich nötig. Das erste ist, dass es neben dem Aufruf von invokedynamic noch eine zusätzliche Information im Bytecode gibt, nämlich von einer Bootstrap-Methode. Findet die JVM zum ersten Mal ein invokedynamic, dann weiß sie nicht, an wen der Aufruf geht und wendet sich an die Bootstrap-Methode. Zur passenden Auswahl der Zielmethode übergibt die JVM an die Bootstrap-Methode Informationen über Aufrufer und Name, sodass alle wichtigen Informationen zur Auswahl des Ziels vorhanden sind. Hier sind wir nun in der zweiten Hälfte, denn zusätzlich zum neuen Bytecode gibt es ein neues Paket java.lang.invoke. Die Bootstrap-Methode spezifiziert mit der API des neuen Pakets die Zielmethode und gibt diese an die JVM weiter. Wenn das einmal geschehen ist, ist der Aufruf gebunden und die JVM ruft beim dynamischen Aufruf direkt die vom Bootstrap gelieferte Methode auf. Der genaue Ablauf bei den invokedynamic-Aufrufen dokumentiert das Paket.
Der neue Bytecode muss von einer Java 7-JVM unterstützt werden und wird von dynamischen Skriptsprachen generiert, um die Aufrufe schnell von der JVM ausführen zu lassen. Normale Entwickler werden den neuen Bytecode kaum brauchen, und im Quellcode ist er eh nicht sichtbar.
Welche Suppress-Warnings gibt es?
Neben den von Generics kommenden Kennungen rawtype und unchecked gibt es weitere, die allerdings nicht sonderlich gut dokumentiert sind. Das liegt auch daran, dass Meldungen während der Programmübersetzung zur Compilerinfrastruktur gehören und nicht zur Laufzeitumgebung, und damit nicht zur traditionellen Java-API. Der Compiler kann im Prinzip beliebige Codeanalysen beliebiger Komplexität vornehmen und bei vermuteten Fehlern Alarm schlagen. Um wir dürfen auch nicht vergessen, dass es nur Warnungen sind: wer als Programmierer alles richtig macht, wird die Meldungen nicht zu Gesicht bekommen. Dennoch ist es relevant, sie zu kennen, denn der Compiler wird manches Mal etwas anmerken, was Entwickler bewusst nutzen wollen, und dann gilt es, die Meldungen abzuschalten.
Die Macher vom Eclipse-Compiler (JDT) dokumentieren die unterstützten Warnungen unter http://help.eclipse.org/juno/index.jsp?topic=%2Forg.eclipse.jdt.doc.user%2Ftasks%2Ftask-suppress_warnings.htm. Neben den aufgeführten Meldungen all, rawtype und unchecked sind folgende noch interessant:
|
@SuppressWarnings |
Unterdrückt Meldungen für |
|
deprecation |
veraltete Elemente, wie new java.util.Date(2012-1970, 3, 3). |
|
incomplete-switch |
ausgelassene Aufzählungen in swich-case-Anweisungen. |
|
resource |
ein nicht geschlossenes AutoClosable, wie new java.util.Scanner(System.in).nextLine(). |
|
serial |
eine serialisierbare Klasse, die keine Serialisierung-ID besitzt. |
|
unused |
nicht benutzte Elemente, etwa nicht aufgerufene private Methoden. |
Einige Werte von @SuppressWarnings
Modulsystem Jigsaw auf Java 9 verschoben
Details bei Mark auf dem Blog: http://mreinhold.org/blog/on-the-next-train
Zweiter Milestone von Eclipse 4.3
Alle Neuerungen hier: http://download.eclipse.org/eclipse/downloads/drops4/S-4.3M2-201209201300/news/. Zur Wiederholung noch einmal von M1: http://download.eclipse.org/eclipse/downloads/drops4/S-4.3M1-201208101300/news/. Das fand ich zum Beispiel nett:

Aber M2 hat nicht so viel Spannendes zu bieten.
JSR 310 Date and Time API hat schon mal eine Seite bei http://openjdk.java.net/
… schauen wir mal wie es für http://openjdk.java.net/projects/threeten/ jetzt weitergeht und ob es wirklich in Java 8 kommt.
Fetter Java 8b55 change set durch viele Locale/Kalender-Änderungen
Alle Änderungen im Überblick http://download.java.net/jdk8/changes/jdk8-b55.html.
Change-Set: 131a683a2ce0
6336885
RFE: Locale Data Deployment Enhancements
4609153
Provide locale data for Indic locales
5104387
Support for gl_ES locale (galician language)
6337471
desktop/system locale preferences support
7056139
(cal) SPI support for locale-dependent Calendar parameters
7058206
Provide CalendarData SPI for week params and display field value names
7073852
Support multiple scripts for digits and decimal symbols per locale
7079560
[Fmt-Da] Context dependent month names support in SimpleDateFormat
7171324
getAvailableLocales() of locale sensitive services should return the actual availability of locales
7151414
(cal) Support calendar type identification
7168528
LocaleServiceProvider needs to be aware of Locale extensions
7171372
(cal) locale’s default Calendar should be created if unknown calendar is specified
Apache Wicket erreicht die Version 6
http://wicket.apache.org/. Änderungen siehe hier: https://wicket.apache.org/2012/09/05/wicket-6.0.0-released.html.
Eclipse-Plugin: Shell-Script-Editor (ShellEd) und Remote System Explorer (RSE)
ShellEd (Bild) ist ein Shell-Script-Editor für Unix-Skripte (also ash, bsh, bash, csh, ksh, sh, zsh). Mit Manual und Vervollständigung. Interessant dazu ist das relativ unbekannte Target Management Project, wo man remote, etwa über SSH oder FTP auf einem Server arbeiten und zum Beispiel Dokumente editieren kann.
Mehr Eclipse-Plugins gibt’s unter http://www.tutego.de/java/eclipse/plugin/eclipse-plugins.html.
Was ist aus Apache Click geworden?
Anfang 2009 schrieb ich im Blog:
Darauf hat die Welt gewartet: Wieder ein neues/altes Web-Framework
Apache Click http://incubator.apache.org/click/ heißt es und läuft ab Java 1.4. Super. Kommt damit 5 Jahre zu spät. Also nix mit Annotationen. Schön XML und so. (Click 0.3 gab es auch schon im März 2005, also ist das Projekt nicht wirklich jung.) Das Wort Ajax taucht auf den ganzen Webseiten nicht auf. Immerhin gibt es eine http://incubator.apache.org/click/docs/click-ide.html auf Eclipse 3.4 Basis. Toll die Antwort auf die Frage "Why develop a new Web Application Framework?" Antwort: "Because the existing frameworks did not meet my needs. Struts doesn’t really do much, while Tapestry is too complicated. For a more comprehensive answer please see Why Click." Klar, als ob es nur Struts und Tapestry gibt. Vor 10 Jahren vielleicht. Bei Struts 1.x ist die Zeit schon lange abgelaufen und bei Tapestry 5 hält man sich noch ein wenig mit DI/IoC über Wasser.
Heute, im Jahr 2012, hat es Click zu einem vollständigen Web-Framework geschafft, die Demos (http://click.avoka.com/click-examples/home.htm) sehen von der Funktionalität OK aus, nur etwas altbacken, etwa so wie Windows 3.1 im Vergleich zu Windows 7.
Das letzte Update von Click ist von März 2011, also 1 1/2 Jahr alt. Das war’s dann wohl.
Android-Phone weg, was tun?
Habe gerade http://www.androidlost.com/ ausprobiert, und das ist ganz cool. Aber hoffentlich bleibt mein Handy bei mir …
Java-Sicherheitslücke nach 4 Monaten geschlossen
Nach dem nun herauskam, dass Oracle von der schweren Lücke schon seit April (!) wusste, hast sich das Unternehmen nun doch genötigt, ein Update zu veröffentlichen. Jeder ist angehalten, das 7u7 sofort (bzw. 6u35) sofort zu installieren.
- http://www.oracle.com/technetwork/topics/security/alert-cve-2012-4681-1835715.html
- http://www.oracle.com/technetwork/java/javase/7u7-relnotes-1835816.html
- http://www.oracle.com/technetwork/java/java-update-release-numbers-change-1836624.html
- http://www.techworld.com.au/article/435007/oracle_knew_about_currently_exploited_java_vulnerabilities_months_researcher_says/
- http://www.theregister.co.uk/2012/08/30/oracle_knew_about_flaws/
- http://www.java.com/de/download/chrome.jsp?locale=de