|  Home  |  IT-KnowHow  |  Sonstiges KnowHow  |  Bookmarks  |  Über mich  |  Impressum  |  1und1 Shop  | 
Google


Referenzierte Quellen 
Aufbau meiner Werkbank 
Synergy 
Unix/Linux 
Debian 
Linux-Distributionen 
Paketverwaltung 
Fileserver 
Samba 
Grafische Oberfläche 
Festplatte - Boot, Partition, Raid, LVM 
SSH Tunnel, VPN 
FAQ 
Tips und Tricks 
Shellprogrammierung 
Windows 
cygwin 
ssh 
andLinux 
UltraISO 
Windows 7 
Windows CE 
Virtualisierung 
VMWare 
VirtualBox 
Cloud Computing 
Google App Engine GAE 
Storage 
AmazonWebServices 
Cloudfoundry 
RightScale 
Office-Pakete 
Serienbriefe mit OpenOffice 
OpenOffice Calc 
Sicherheit 
Abwehrmechanismen 
Zertifikate + SSL 
Zertifikate + eMail-Kommunikation 
Backup 
Tools 
Bacula 
Installation 
Tools 
Virenscanner 
Online-Banking 
Rechnerbetreuung 
Muli 
Schnecke 64 
Schnecke 256 
Opaks 
cooltek 
Laptop-Pflege 
Computer im Remote-Einsatz 
Software-Entwicklung 
Erfolgreiches Vorgehen 
Agile Softwareentwicklung 
Test-Driven-Development 
Software-Factory 
Domain-Driven-Design 
Model-Driven-Architecture 
CMMI 
Organisation 
Team 
Rollen im Projekt 
Anforderungen 
Anforderungs-Entwicklung 
Anforderungs-Management 
Architektur 
Best Concepts and Patterns 
Best Practices 
Camel 
IPF 
Design 
Best Practices 
Schnittstellen 
Persistenz 
ExceptionHandling 
Deklarative Entwicklung 
SOA 
UML Tools 
Programmierung 
Best Practices 
Java Core 
Classloader 
Generics 
JMX 
Anotationen 
Networking 
Threads 
I/O, Dateien, Steams 
Java EE 
Groovy 
Google Web Toolkit - GWT 
GUI Entwicklung 
HTTP 
Zeichencodierung 
XML 
XPath 
Json 
JSF 
CSS 
Firefox 
Eclipse Platform 
Eclipse als Java-IDE 
Derivate 
Organisation 
Debugging 
J2EE 
CMR mit WSAD 5.1 
PlugIns 
Subversion 
Git Plugin 
Sun Application Server 
JBoss 
Jetty 
Tomcat 
WebServices 
WSDL 
RESTful Webservices 
SOAP Webservices 
JMS - ActiveMQ 
Persistenz 
JDBC 
JPA / Hibernate 
JPA in Eclipse 
Oracle 
Performance / Tuning 
DB2 
MySQL 
MySql Administrator 
HSQLDB 
Microsoft SQL Server 
DBVisualizer 
Toad 
TOra 
Spring 
AOP 
Refactoring 
Logging 
Regex 
Lucene 
Mail 
Mailserver 
Mailclient 
JavaMail 
DNS 
LDAP 
Mobile Computing 
Platformen 
Android 
Handyauswahl 
Tablet a la iPad  
... aus Sicht des Handynutzers 
App Markets 
... aus Sicht des Entwicklers 
Plattform 
Programmierung 
... aus Sicht des Hackers 
Apps im Test 
Buildprozess 
ant 
maven 
Gradle 
Versionsverwaltung 
Subversion 
Git 
Zertifikate + SSL 
Dokumentation 
Kosten/Nutzen 
Index-Server 
Testen 
FIT 
FitNesse 
Selenium 
Performance 
JMeter 
soapUI 
EasyMock 
Lizenzmodelle 
HL7, CDA, CCD 
IHE Profile + Transaktionen 
ITIL 
IRC 
Netzwerke 
Provider 
Telefon 
Breitband-Internet 
Webhosting 
Webhoster 
Trafficanalyse 
Suchmaschinen 
Spam 
Internet-Werbung / AdSense 
1und1 - SmartDrive 
CMS 
Exponent 
Joomla 
Foto-Galerie 
Verschiedene 
(W)LAN 
Multimedia 
Gimp 
XnView 
Fotografie 
Digitale Fotografie 
Audio 
Voice-over-IP 
Video 
Video-over-IP 
DLNA, UPnP 
Videorekorder 
Hardware 
MP3 Player 
(Multi-Funktions-) Drucker 
Fritzbox 7390 
FritzBox 7270 
Netgear FM114P 
Mini-Fernseher 
Fernseher 2008 
Panasonic TX-P42GW20 
Fernseher 2012 
Netzwerkplayer 
Fernbedienung 
Satellitenanlage 
dbox 
Thomson IP1101 
Codemeter 
Navigationsgerät 
Pari Boy 
Kabelsalat 
Fuji Finepix S602 
Canon Ixus 40 
Canon Ixus 100 IS 
Spiegelreflex-Kamera 
Nikon D80 
Video-Kamera 
Ultra Mini PC - Asus eee PC 
Notebook 2012 
GPSMAP 76CSx 
Canon Lide 20 Scanner 
Lenovo UltraNav Tastatur 
Computer-Monitor - LG 2442 BF 
Kyocera FS-920 
Wäschetrockner 
Bluetooth Tastatur 



IT-KnowHow  > Software-Entwicklung  > Programmierung  > Java Core 


Aufbau

Java besteht aus einem
  • Software Development Kit (SDK): wird zum Compilieren (javac.exe) von Source-Code in Bytecode benötigt. Bringt ausserdem noch einige Tools mit, so dass man keine der modernen Entwicklungsumgebungen braucht:
    • Debugger (jdb)
    • Disassembler (javap)
    • JavaDoc-Generator (javadoc)
    • jar-Archivierungstool (jar)
  • Java Runtime Environment (JRE): wird zum Starten von Java-Applicationen benötigt (java.exe)
Auf dem Java-Kern setzen weitere Komponenten (z. B. Java 2 Enterprise Edition auf).

Sun ist bei weitem nicht der einzige Anbieter eines SDK, ein weiterer bekannter Vertreter ist IBM. Leider unterscheiden sich die Namen der Bibliotheken zwischen den verschiedenen Herstellern. Beispielsweise befindet sich die Klasse "java.lang.String" (also eine Basis-Klasse) in der Bibliothek "rt.jar", bei IBM befindet sie sich in der Bibliothek "core.jar".

Compilierung ohne javac:

Die Compiler-Bibliotheken befinden sich in der Bibliothek tools.jar. Will man beispielsweise aus eine Java-Applikation den Compiler nutzen, so benötigt man die tools.jar auf jeden Fall im Classpath. Dort ist der Java-Compiler (com.sun.tools.javac.Main) zuhause. Beispiel:

Ein ant-Skript wird nicht über eine ant.exe angestossen, sondern über:

java -jar c:\Programme\ant.jar -buildfile mybuild.xml

so wird dies zu folgender Fehlermeldung führen

unable to find a javac compiler

, sofern die tools.jar nicht im Bootclasspath ist. Mit folgenden Befehl klappts:

java -cp c:\Programme\j2sdk1.4.2\lib\tools.jar -jar c:\Programme\ant.jar -buildfile mybuild.xml

Ant macht hier nämlich nichts anderes als den Compiler programmatisch aufzurufen und braucht dazu com.sun.tools.javac.Main.

Ein anderer Anwendungsfall für das Compilieren von Java-Klassen aus einer Java-Applikation heraus ist ein Servlet-Container, der Java-Source-Code für geänderte JSPs neu erzeugt und compiliert (hier findet man weitere Informationen und auch ein Beispiel: http://java.sun.com/developer/JDCTechTips/2003/tt0722.html#2).

ACHTUNG: ab JDK 1.5 ist "com.sun.tools.javac.Main" deprecated und sollte durch "javax.tools.JavaCompilerTool" ersetzt werden. Erst ab JDK 1.6 wird der programmatische Compiler-Aufruf offiziell eingeführt.

Classpath


Sowohl beim Compilieren als auch beim Starten einer Java-Applikation ist der Classpath von entscheidender Bedeutung und hat schon so manchen Java-Novizen um den Verstand gebracht (und da schliesse ich mich ein ;-). Leider weiss man bei den modernen Entwicklungsumgebungen manchmal nicht, wie sich der Classpath zusammensetzt (es gibt hier viele Einstellungen wie hier und hier zu sehen ist). Vor diesem Hintergrund ist es manchmal sogar schneller, wenn man die gute alte Kommandozeile nutzt. Will man eine Anwendung ausserhalb der Entwicklungsumgebung nutzen, führt eh kein Weg an der Kommandozeile und ant vorbei.

Man unterscheidet den
  • BootClasspath: kann (nur in Ausnahmefällen erforderlich) über die Option "-Xbootclasspath" der Laufzeitumgebung mitgegeben werden. Dieser Classpath hat also höhere Priorität als der normale Classpath.
  • normalen User-Classpath: wird über die Option "-classpath" an den Compiler oder die Laufzeitumgebung mitgegeben
  • Extensions-Classpath
Hier findet man viele Informationen zum normalen Classpath (ich wills nicht wiederholen): http://mindprod.com/jgloss/classpath.html)

Will man wissen mit welchem Classpath eine Anwendung gestartet wurde, dann kann man programmatisch folgendes tun:

System.out.println(System.getProperty("java.class.path"));

Websphere macht das beim Starten von allein. Vielen Dank :-)

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();