FAQ - Tips'n Tricks
Frage: Wie mache ich in JDK 1.3.x aus einem Array ([]) eine ArrayList?
Antwort: new ArrayList(java.util.Arrays.asList(myEckigeKlammernArray))
Frage: Wie instanziiere ich ein anonymes Array?
Antwort: new Class[] { String.class, Integer.class }; new int[] {1, 2, 3}
Frage: Wie implementiere ich eine anonyme Klasse (also eine anonyme Implementierung des Interfaces)?
Antwort: Beispiel:
public interface Closure {
public void on(Object object);
}
public class AntragsPartner {
public void apply(Closure closure) {
...
}
}
public class SomeClass {
AntragsPartner antragsPartner = ...;
antragsPartner.apply(
new Closure() {public void on(Object object) {
...
}
} );
}
Frage: Was ist ein Dynamic Proxy, welche Vorteile haben sie und wie setze ich sie ein?
Antwort: Eine gute Darstellung dieses seit Java 1.3 vorhandenen Konzepts findet man
hier und
hier. Ein Dynamic Proxy implementiert zur Laufzeit ein oder mehrere beliebige Interfaces - der Dynamic Proxy wird folgendermassen instanziiert:
java.lang.reflect.Proxy.newProxyInstance(classLoader, new Class[] { MyInterface.class}, myInvocationHandler)
Der übergebene "myInvocationHandler" wird über Aufrufe des Proxy per invoke-Methode des InvocationHandler-Interface) informiert:
public Object invoke(Object proxy, Method method, Object[] args)
Dabei ist "proxy" die Instanz des DynamicProxy (von dem der invoke-Aufruf kommt) und "method"/"args" ist die aufgerufene Methode des Interfaces (im Beispiel: MyInterface). Die eigentliche Durchführung des Requests wird i. a. vom InvocationHandler an ein Target-Objekt delegiert. Dieses Target-Objekt sollte man sich im InvocationHandler merken. Den InvocationHandler kann man nutzen, um beispielsweise Zugriffrechte zu prüfen, Logging durchzuführen und weitere CrossCutting-Concerns abzubilden - man ist hier übrigens recht nah an Aspektorientierter Programmierung, die teilweise auch über Dynamic Proxies abgebildet ist. Ein komplettes Beispiel findet man
hier.
Frage: Beim Ausführen einer Java-Applikation mit dem Interpreter "java" bekomme ich die Fehlermeldung "unsupported major.minor.version 48.0". Was mache ich falsch?
Antwort: Das liegt höchstwahrscheinlich an einer Inkompatibilität im Bytecode. Die Klassen wurden vielleicht mit einer jüngeren Java-Version compiliert als sie jetzt interpretiert werden sollen (compiliert mit java 11.4, ausgeführt mit java 1.3).
Frage: Kann ich eine Inner-Class auch von aussen nutzen?
Antwort: Das kommt auf die Berechtigung an und aus welcher Klasse man es nutzen will. Wenn die Klasse beispielsweise Package-protected deklariert ist wie die Klasse DateConverter im folgenden Beispiel
public class AntragFromXmlCreator {
...
static class DateConverter {
...
}
}
dann kann ich diese Klasse aus einer Klasse im gleichen Package folgendermassen instanziieren (sinnvoll beispielsweise für JUnit-Tests, die i. a. im gleichen Package liegen - wenn auch in einem anderen Projekt):
new AntragFromXmlCreator.DateConverter()
Frage: Wie gebe ich den StackTrace einer Exception in einen String aus?
Antwort: StringWriter stringWriter = new StringWriter();
exception.printStackTrace(new PrintWriter(stringWriter));
String exceptionString = stringWriter.toString();