Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger

 << zurück
Java ist auch eine Insel von Christian Ullenboom
Programmieren für die Java 2-Plattform in der Version 5
Java ist auch eine Insel

Java ist auch eine Insel
5., akt. und erw. Auflage
1454 S., mit CD, 49,90 Euro
Galileo Computing
ISBN 3-89842-747-1
gp Kapitel 21 Reflection und Annotationen
  gp 21.1 Metadaten
    gp 21.1.1 XDoclet
  gp 21.2 Mit dem Class-Objekt etwas über Klassen erfahren
    gp 21.2.1 An ein Class-Objekt kommen
    gp 21.2.2 Was das Class-Objekt beschreibt
    gp 21.2.3 Der Name der Klasse
    gp 21.2.4 Die Arbeit auf dem Feld
    gp 21.2.5 instanceof mit Class-Objekten
    gp 21.2.6 Oberklassen finden
    gp 21.2.7 Implementierte Interfaces einer Klasse oder eines Inferfaces
    gp 21.2.8 Modifizierer und die Klasse Modifier
    gp 21.2.9 Die Attribute einer Klasse
    gp 21.2.10 Methoden einer Klasse erfragen
    gp 21.2.11 Konstruktoren einer Klasse
    gp 21.2.12 Annotationen
  gp 21.3 Objekte manipulieren
    gp 21.3.1 Objekte erzeugen
    gp 21.3.2 Die Belegung der Variablen erfragen
    gp 21.3.3 Eine generische toString()-Funktion
    gp 21.3.4 Variablen setzen
    gp 21.3.5 Private Attribute ändern
  gp 21.4 Methoden aufrufen
    gp 21.4.1 Statische Methoden aufrufen
    gp 21.4.2 Dynamische Methodenaufrufe bei festen Methoden beschleunigen
  gp 21.5 Informationen und Identifizierung von Paketen
    gp 21.5.1 Geladene Pakete
  gp 21.6 Annotationen
    gp 21.6.1 Neue Annotationen definieren
    gp 21.6.2 Annotationen mit genau einem Element
    gp 21.6.3 Beliebige Schlüssel-/Werte-Paare
    gp 21.6.4 Vorbelegte Elemente
    gp 21.6.5 Annotieren von Annotations-Typen
    gp 21.6.6 Annotationen zur Laufzeit ausgelesen
    gp 21.6.7 Mögliche Nachteile von Annotationen


Galileo Computing

21.5 Informationen und Identifizierung von Paketedowntop

Das Class-Objekt einer Klasse erlaubt nicht nur Anfragen über die Eigenschaften der Objekte, sondern auch Zugriff auf die Informationen des Pakets. Damit lässt sich erfragen, aus welchem Paket eine Klasse kommt und auch, ob sie kompatibel mit einer gewünschten Version ist. Aussagen dieser Art sind wichtig, denn auf Systemen könnten die unterschiedlichsten Laufzeitumgebungen vorhanden sein.

Aussagen über ein Paket macht die Klasse Package. Über die Objektfunktion getPackage() eines Class-Objekts bekommen wir das Paket, dem das Class-Objekt angehört.

Package pkg = Class.forName("java.util.regex.Pattern").getPackage();

Intern wird der aktuelle Klassenlader angewiesen, den Namen des Pakets auf ein Package-Objekt zu übertragen. Das Package-Objekt wiederum enthält Informationen über das Paket. Gibt es keine Informationen vom Klassenlader, so liefert getPackage() die Rückgabe null.


Beispiel   Erfrage Informationen über das Paket java.util.regex.

Listing 21.19   PaketInfo.java, main()

Package pkg = Class.forName("java.util.regex.Pattern").getPackage();
java.io.PrintStream p = System.out;
// title of package
p.println( pkg.getImplementationTitle() );  // Java Runtime Environment
// name of vendor
p.println( pkg.getImplementationVendor() ); // Sun Microsystems, Inc.
// version of implementation
p.println( pkg.getImplementationVersion() );// 1.5.0_03
// name of this package
p.println( pkg.getName() );                 // java.util.regex
// title of the specification that package implements
p.println( pkg.getSpecificationTitle() );   // Java Platform API Specification
// name of vendorowns and maintains the specification
p.println( pkg.getSpecificationVendor() );  // Sun Microsystems, Inc.
// version number of the specification
p.println( pkg.getSpecificationVersion() ); // 1.4
// Is this package compatible with the requested version
p.println( pkg.isCompatibleWith("1.2.0") ); // true
// test if package is sealed
p.println( pkg.isSealed() );                // false

Bis auf die Funktionen isCompatibleWith() und isSealed() sind die anderen Methoden intuitiv. isCompatibleWith() liefert true, wenn das aktuelle Paket der laufenden VM mit der gewünschten Version übereinstimmt. Wenn wir uns wünschen, dass das Paket in der Version 1.2.0 gefordert ist und wir die Version 1.4 anbieten, dann ist das Ergebnis wahr. Steht uns nur die Version 1.2 zur Verfügung, gefordert ist jedoch das Paket 1.3, dann stünden wir vor einem Problem. Die Zahlen werden Ziffer für Ziffer verglichen. Ist die aktuelle Nummer größer, dann ist alles in Ordnung. Auch 1.3 ist größer als 1.2 und 1.0.1 kleiner als 1.1.2.


Galileo Computing

21.5.1 Geladene Pakete  toptop

Um an alle geladenen Pakete des Klassenladers zu kommen, nutzen wir die statische Funktion getPackages() der Klasse Package. Wir erhalten ein Feld von Package-Elementen, die wir, wie oben, gesehen, abfragen können.


Beispiel   Gib unter Java 1.4 alle geladenen Klassen aus, die seit Beginn des Programms geladen sind. Erzeuge anschließend ein Button-Objekt, welches das Paket java.awt lädt.

Listing 21.20   AllePakete.java

public class AllePakte
{
  public static void main( String[] args )
  {
    for ( Package pack : Package.getPackages() )
      System.out.println( pack );
    System.out.println( "---" );
    new java.awt.Button();
    for ( Package pack : Package.getPackages() )
      System.out.println( pack );
  }
}

Vergleichen wir die ersten Ausgaben und die Ausgaben nach dem Laden der Schaltfläche, so entdecken wir unter 1.4 folgende neue Pakete:

package java.awt, Java Platform API Specification, version 1.4
package java.awt.dnd.peer, Java Platform API Specification, version 1.4
package java.awt.image, Java Platform API Specification, version 1.4
package java.awt.peer, Java Platform API Specification, version 1.4
package javax.accessibility, Java Platform API Specification, version 1.4
package sun.awt, Java Platform API Specification, version 1.4
package sun.awt.windows, Java Platform API Specification, version 1.4

Nicht immer sind Informationen über Pakete erhältlich. Es gibt sie nur, wenn die Informationen zusätzlich definiert wurden. Das geschieht in der Regel in der Manifest-Datei eines Jar-Archivs. Zum Beispiel finden wir dort:

Manifest-Version: 1.0
Name: java/util/
Specification-Title: "Java Utility Classes"
Specification-Version: "1.2"
Specification-Vendor: "Sun Microsystems Inc.".
Package-Title: "java.util"
Package-Version: "build57"
Package-Vendor: "Sun Microsystems. Inc."
 << zurück




Copyright © Galileo Press GmbH 2005
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de