Galileo Computing < openbook >
Galileo Computing - Professionelle Buecher. Auch fuer Einsteiger.
Galileo Computing - Professionelle Buecher. Auch fuer Einsteiger.


Java ist auch eine Insel von Christian Ullenboom
Buch: Java ist auch eine Insel (Galileo Computing)
gp Kapitel 21 Reflection
gp 21.1 Einfach mal reinschauen
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 Oberklassen finden
gp 21.2.5 Implementierte Interfaces einer Klasse oder eines Inferfaces
gp 21.2.6 Modifizierer und die Klasse Modifier
gp 21.2.7 Die Attribute einer Klasse
gp 21.2.8 Methoden einer Klasse erfragen
gp 21.2.9 Konstruktoren einer Klasse
gp 21.3 Objekte manipulieren
gp 21.3.1 Objekte erzeugen
gp 21.3.2 Die Belegung der Variablen erfragen
gp 21.3.3 Variablen setzen
gp 21.3.4 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


Galileo Computing

21.5 Informationen und Identifizierung von Paketendowntop

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.18 PaketInfo.java

public class PaketInfo
{
  public static void main( String args[] ) throws Exception
  {
    Package pkg = Class.forName("java.util.regex.Pattern").getPackage();
    
    if ( pkg == null )
    {
      System.out.println( "No version information" );
      return;
    }
    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.4.0
    // name of this package
    p.println( pkg.getName() );                // java.lang
    
    // 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. Haben wir nur die Version 1.2, aber gefordert ist das Paket 1.3, dann hätten wir ein Problem. Die Zahlen werden Ziffer für Ziffer verglichen. Ist die aktuelle Nummer größer, ist alles in Ordnung. Auch 1.3 ist größer als 1.2, und 1.0.1 ist kleiner als 1.1.2.


Galileo Computing

21.5.1 Geladene Paketetoptop

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, wie oben gesehen, abfragen können.


Beispiel Gib 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.19 AllePakete.java

public class AllePakete
{
  public static void main( String args[] )
  {
    Package pack[] = Package.getPackages();
    
    for ( int i = 0; i < pack.length; i++ )
      System.out.println( pack[i] );
    System.out.println( "---" );
    
    new java.awt.Button();
    
    pack = Package.getPackages();
      for (int i = 0; i < pack.length; i++)
      System.out.println( pack[i] );
  }
}

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."




Copyright (c) Galileo Press GmbH 2004
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, Gartenstraße 24, 53229 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de