21.5 Informationen und Identifizierung von Paketen
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.
21.5.1 Geladene Pakete
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."
|