Anhang A Der ASCII-Zeichensatz

Anhang A Der ASCII-Zeichensatz Der ASCII-Zeichensatz ist die US-nationale Ausprägung des ISO-7-Bit-Codes (ISO 646). Eine weitere nationale Ausprägung ...
58 downloads 2 Views 5MB Size
Anhang A Der ASCII-Zeichensatz Der ASCII-Zeichensatz ist die US-nationale Ausprägung des ISO-7-Bit-Codes (ISO 646). Eine weitere nationale Ausprägung des ISO-7-Bit-Codes ist der nach DIN 66003 spezifizierte deutsche Zeichensatz, bei dem die Zeichen Ä, Ö, Ü, ä, Ö, Ü und ß berücksichtigt wurden. Im DIN-Zeichensatz sind gegenüber dem ASCII-Zeichensatz folgende Änderungen vorgenommen worden: [=Ä

\=Ö

]=ü

{=ä

I=ö

}=ü

-=ß

Bei manchen Rechnern wie z.B. beim IBM-PC wird aber ein erweiterter ASCIIZeichensatz eingesetzt, bei dem alle 8 Bits verwendet werden. Die ersten 128 Zeichen stimmen dabei mit dem 7-Bit ASCII-Code in Tabelle überein. Die Sonderzeichen Ä, Ö, Ü, ä, Ö, ü und ß befinden sich dabei im Bereich 128-255. Wie aus Tabelle A-1 und Tabelle A-3 ersichtlich ist, enthält der ASCII-Zeichensatz Buchstaben, Ziffern, Sonderzeichen und Steuerzeichen. Da jedem Zeichen im Rahmen des jeweiligen Codes eine 7- bzw. 8-stellige Binärzahl eindeutig zugeordnet ist und die Binärzahlen selbst eine geordnete Menge darstellen, bilden damit in jedem dieser Codes die Zeichen eine geordnete Menge. Es gibt für die Zeichen also ein vorher «) und nachher (», so dass die Zeichen dem Code entsprechend alphabetisch sortiert werden können.

830

Anhang A

Dez.

Hex.

Clrl-Ch. Char.

0

00

"@

1

01

"A

2

02

"B

3

"C

7

03 04 05 06 07

8

08

"H

9

09

10

OA

"I IIJ

(ii)

•., • •

Dez.

20

33

21 22

11

OB

"K

12

OC

"L

13

00

"M

~ I

14

OE

"N

~

15

OF

11()

16

10

"p

17

11

IIQ

18

12

"R

t

19

13

"S

!!

34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51

20

14

"T

11

21

15

"U

§

22

16

23

17

"w

24

18

25

19

26

lA

4 5 6

"0 "E



"F "G

• a 0



Hex.

Char.

40

@

Dez. 96

41

A

97

61

42

B

98

62

b

43 44 45 46 47 48 49 4A 4B 4C 40 4E 4F 50 51 52 53 54 55 56 57 58 59 5A SB SC 50 SE 5F

C

99

63

c

0

100

64

d

E F

101

65

e

102

66

f

G

103

67

9

H

104

68

h

I

105

69

i

J K

106

6A

107

6B

L

108

6C

j k I

M

109

60

m

N

110

6E

n

0 P

111 112

6F

0

70

P

Q

71

R

113 114

72

q r

S

115

73

5

T

116

74

t

U

117

75

u

Hex. Char. 60

a

V

118

76

v

W

119

w

X

120

Y

121

Z

122

[

123

\ ]

124 125 126

77 78 79 7A 7B 7C 70 7E 7F

"

127

-

x Y

z (

I )

Cl

Tabelle A-1 Der ASCII-Zeichensatz mit 128 Zeichen

In der Spalte Control-Character (Steuerzeichen), abgekürzt durch Ctrl-Ch., werden spezielle Tastenkombinationen angegeben, mit denen Steuerzeichen erzeugt werden können. Hierbei kann es je nach Betriebssystem auch geringfügige Modifikationen geben. Die ersten 32 ASCII-Zeichen stellen Steuerzeichen für die Ansteuerung von Peripheriegeräten und die Steuerung einer rechnergestützten Datenübertragung dar. Diese Zeichen tragen die Namen: Dez. Symbol Dez. Symbol Dez. Symbol Dez. Symbol Dez. Symbol Dez. Symbol 0

NUL

6

ACK

12

FF

18

OC2

24

CAN

30

RS

1

SOH

7

BEL

13

CR

19

OC3

25

EM

31

US

2

STX

8

BS

14

SO

20

OC4

26

SUB

3 4

ETX EOT ENQ

9 10 11

HAT LF.NL VT

15 16

27 28 29

ESC FS

5

17

SI

21

NAK

OLE OCl

22

SYN ETB

23

GS

Tabelle A-2 Namen der 32 Steuerzeichen des ASCII-Zeichensatzes

So ist beispielsweise FF die Abkürzung für Form Feed, d.h. Seitenvorschub, oder CR die Abkürzung für Carriage Return, dem Wagenrücklauf, der schon von der Schreibmaschine her bekannt ist.

ASCII-Zeichensatz

831

Dez Hex Char

Dez Hex Char

Dez Hex Char

Dez Hex Char

Dez Hex Char

0

00

43

2B

86

56

V

129

81

AC

JO

215

1

01

44

2C

87

57

W

130

82

e

172 173

AO

i

216

08

2

02

45

20

88

58

131

83

ä

174

AE

«

217

09

3

03

4

04

5

05

6

06

7

07

8

08

9

09

10

OA

11

OB

•'.," • • •

89

59

132

84

AF

5A

Z

133

85

a

175

90

176

BO

0

91

5B

86

ä

177

B1

92

5C

[ \

134

1

135

87

178

B2

32

2

93

50

I

C

136

88

179

B3

51

33

3

94

5E

A

137

89

52

34

4

95

5F

-

138

8A

e

53

35

5

96

60

139

8B

54

36

6

97

61

a

140

8C

'i'

55

37

7

98

62

b

141

80

I

56

38

8

99

63

c

142

8E

Jl

57

39

9

100

64

d

143

8F

58

3A

101

65

e

144

90

102

66

f

145

91

ce

188

103

67

9

146 92

~

189

46

2E

47

2F

/

48

30

49

31

50

a 0



• Ch ..... NICMIme ) .... _1

I~:I

..... Pm .. ~

llsst sieb der Vomame der Penoa er&-aaen

I~

'~ 'd~m ""

B 2 Java-Laufzeitumgebung Unter der Java-Laufzeitumgebung versteht man einen Java-Interpreter. Im ersten Unterkapitel wird kurz auf die Java-Properties eingegangen. In den darauf folgenden Kapiteln werden die Laufzeitumgebungen java und appletviewer beschreiben.

B 2.1 Properties In Java geschriebene Programme haben nicht die Möglichkeit, direkt auf Umgebungsvariablen des Betriebssystems zuzugreifen. So ist es beispielsweise nicht möglich, die Werte der Umgebungsvariable path oder classpath der Systemumgebung auszulesen, wie dies in C oder C++ möglich ist. In Java gibt es jedoch einen ähnlichen Mechanismus, um auf Variablen der Laufzeitumgebung zuzugreifen. Dies wird durch sogenannte Properties ermöglicht. Auf Properties kann mit der Methode getProperty () der Klasse System zugegriffen werden. Es gibt eine ganze Reihe von Properties, die in einem Java-Programm ausgelesen werden können. Beispiele hierfür sind die Properties java. version, user. name oder user. dir. Sie sind in jeder virtuellen Maschine vorhanden. Es können jedoch

Java-Tools und -Laufzeitumgebung

837

auch eigene Properties an die virtuelle Maschine übergeben werden. Dies wird näher in Kapitel B 2.2 erklärt. Im Folgenden wird ein Beispielprogramm beschrieben, das die Properties java. version und user. name ausliest und auf die Standardausgabe schreibt: public class PropertyTest {

public static void main (String[] args) {

String version = System.getProperty ("java.version"); System.out.println ("Java Version: " + version); String name = System.getProperty ("user.name"); System.out.println ("Benutzername: " + name);

[YJ I

Die Ausgabe des Programms ist: Java Version: 1.2.2 Benutzername: mueller

Manche Properties können nur von Applikationen oder Applets mit besonderen Rechten gelesen werden. Dies wird genauer in Kapitel 22 beschreiben.

B 2.2 java Die Java Virtuelle Maschine wird mit java [options] class [argument ... ]

aufgerufen. Unter options können dabei optionale Kommandozeilenschalter angegeben werden. Im Folgenden sind nur die wichtigsten beschreiben. Unter class wird die Startklasse des Java-Programms angegeben. Unter argument können ein oder mehrere durch Kommata getrennte Programmparameter übergeben werden. Diese können dann in der Methode main () aus dem Übergabeparameter String [] args ausgelesen werden. Standard-Optionen • -classpath classpath Mit dieser Option wird der CLASSPATH für die Aus-

führung eines Java-Programms gesetzt. Eine eventuell vorhandene Umgebungsvariable CLASSPATH, die bereits auf der Kommandozeile gesetzt wurde, wird hierbei überschreiben.

838

Anhang B

• -Dproperty=value

Mit dieser Option können der virtuellen Maschine benutzerdefinierte Properties mitgegeben werden. Diese können dann ebenfalls mit der Methode getproperty () der Klasse System ausgelesen werden.

• -verbose

Mit dieser Option kann die virtuelle Maschine dazu veranlasst werden, Informationen über die Ausführung auszugeben. Mögliche Einstellungen sind -verbose: class, -verbose: gc oder -verbose: jni.

• -version

Mit diesem Schalter wird die Version der Java Virtuellen Maschine auf der Standardausgabe ausgegeben.

• -help

Mit diesem Schalter werden alle Optionen als Hilfe angezeigt.

• -x

Mit diesem Schalter werden alle Nicht-Standard- Optionen auf der Standardausgabe ausgegeben.

Nicht-Standard Optionen • -Xnoclassgc

Mit dieser Option wird die Garbage Collection für Klassen ausgeschaltet.

• -Xmsn

Mit dieser Option läßt sich die Anfangsgröße des Heaps der virtuellen Maschine festlegen. Ein Beispiel hierfür ist die Angabe -XmslDm. Hiermit wird die Anfangsgröße auf 10MB festgelegt.

• -Xmxn

Mit dieser Option läßt sich die maximale Größe des Heaps der virtuellen Maschine festlegen. Ein Beispiel hierfür ist die Angabe -Xmx2 Dm. Hiermit wird die maximale Größe auf 20 MB festgelegt.

B 2.3 Appletviewer Mit dem Appletviewer lassen sich Applets samt ihrer HTML-Seite testen. Dabei wird von der HTML-Seite jedoch nur das Applet-Tag berücksichtigt, die Seite an sich wird nicht angezeigt. Der Appletviewer läßt sich mit appletviewer [options] urls starten. Als options können dabei optionale Kommandozeilenschalter angegeben werden. Als urls lassen sich eines oder mehrere HTML-Dokumente, die Applets enthalten, angeben wie in folgendem Beispiel: appletviewer Schule.html

Java-Tools und -Laufzeitumgebung

839

B 3 Jar-Dateien Bei j ar-Dateien handelt es sich um Dateien, die verschiedene Dateien in einem Archiv zusammenfassen. Ein Archiv dient zur Zusammenstellung mehrerer Dateien - in gepackter oder ungepackter Form - in einer einzigen Datei. Der Inhalt jeder .jar- Datei kann auch mit jedem gängigen zip-Tool entpackt und angesehen werden. j ar-Dateien wurden in Java aus zwei Gründen eingeführt. Bei Java-Programmen handelt es sich immer um eine mehr oder weniger lose Sammlung von . class Dateien. Die Anzahl der. class Dateien kann in größeren Projekten leicht die Zahl 1000 überschreiten. Damit bei der Auslieferung eines Programms nicht so leicht Dateien verloren gehen, wurden die jar-Dateien eingeführt. Ein weiterer wichtiger Grund ist bei der Verwendung von Applets zu finden. Bei einem Applet werden alle im Applet benötigten Klassen einzeln von einem HTTP-Server geladen. Dabei wird für das Laden jeder Datei eine neue HTTP-Verbindung aufgebaut. Wird eine einzelne komprimierte j ar-Datei geladen, so ist nur eine Verbindung nötig - die Übertragungszeit wird dadurch und durch die Komprimierung wesentlich verringert. Zusätzlich läßt sich eine jar-Datei noch signieren. Siehe hierzu Kapitel B 4. In einer jar-Datei können Klassen, Bilder und Audiodateien aufgenommen werden. Zu Erstellung einer jar-Datei wird das Tool jar mit dem JDK ausgeliefert. Seine Benutzung ist nahezu identisch mit dem tar Kommando unter UNIX: jar [options] Zieldatei Dateien Die Zieldatei ist das jar-Archiv, in dem alle unter Dateien angegebenen Dateien gespeichert werden sollen. Mit den folgenden Optionen läßt dies beeinflussen: • c •

T

• x •

f

• v • 0

• u

Erzeugt eine neues jar-Archiv Gibt den Inhalt einer j ar- Datei auf der Standard ausgabe aus. Entpackt die angegebenen oder alle Dateien, die sich in dem angegebenen j ar-Archiv befinden Mit dieser Option wird der Name der jar-Datei angegeben. Ist diese Option eingeschaltet, so wird der Fortschritt beim Packen oder Entpacken einer j ar-Datei angezeigt. Wird diese Option angegeben, so werden die Dateien unkomprimiert im j arArchiv abgelegt. Mit der Option u kann eine schon bestehende j ar-Datei aktualisiert werden.

Im Folgenden wird an einem Beispiel gezeigt, wie das Tool zu verwenden ist. Es wird dabei angenommen, dass sich die Dateien Person.class, Student.class und Schueler. class in einem Verzeichnis befinden. Mit jar cfv test. jar *. class werden alle. class Dateien, also die Dateien Person. class, Student. class und Schueler. class in die jar-Datei

840

Anhang B

test. jar gepackt. Mit der Option v wird die Fortschrittsanzeige angeschaltet. Dabei ergibt sich folgende Ausgabe:

L!J 11

added manifest adding: Person.class(in = 316) (out= 242) (deflated 23%) adding: Schue1er.class (in = 768) (out= 458) (deflated 40%) adding: Student.class(in = 713) (out= 458) (deflated 35%)

Wie aus der Ausgabe ersichtlich ist, wird außer den drei . class Dateien noch eine sogenannte Manifest-Datei in die jar-Datei aufgenommen. Sie enthält Informationen über jede Datei, die in der jar-Datei enthalten ist. Mit j ar t f tes t . j ar wird der Inhalt der j ar-Datei ausgegeben. Mit j ar xf test. jar wird die jar-Datei wieder entpackt. Um in Applets jar-Dateien verwenden zu können, wurde das Applet-Tag um den Parameter archive erweitert: Alle für in der Klasse Schule benötigten Klassen werden nun aus der Datei schule. j ar geladen.

B 4 Java Security Tools In den folgenden Unterkapiteln sollen die Tools des JDK für alle sicherheitsrelevanten Teile erklärt werden. Da eine ausführliche Beschreibung bei weitem den Rahmen dieses Buches sprengen würde, werden die wichtigsten Funktionen dieser Tools an hand eines durchgängigen Beispiels erklärt. Dabei wird zuerst die Erzeugung eines Zertifikats mit dem keytool betrachtet, danach wird mit dem Tool jarsigner die j ar-Datei eines Java-Programms signiert. Zum Schluß wird noch eine Policy Datei erzeugt, die der signierten j ar-Datei mehr Rechte einräumt.

B 4.1 Keytool Keytool wird zur Erzeugung von Schlüsseln bzw. Zertifikaten verwendet. Zusammen mit jarsigner ersetzt es das Tool javakey aus JDK 1.1.x. Keytooloperiert auf einer Datei, die. keystore genannt wird. Diese liegt defaultmäßig in dem durch java. horne angegebenen Verzeichnis und heißt . keystore. Mit der Option keystore kann auch eine andere Datei angegeben werden. Die Erzeugung eines public/private-Schlüssel-Paares erfolgt durch den Aufruf keytool -alias Schlüsselnarne -genkey. Dabei wird mit "Schlüsselname" ein Alias für den erzeugten Schlüsseleintrag angegeben, z.B. "maier".

Java-Tools und -Laufzeitumgebung

841

Im Folgenden wird ein Schlüsselpaar unter dem Alias "maier" in einer Keystore-Datei mit Namen "myKeys" im lokalen Verzeichnis erzeugt: keytool -alias maier -genkey -keystore myKeys

Das Programm keytool fragt dabei als nächstes nach einem Passwort für die Keystore-Datei: Enter keystore password:

Das Passwort muss mindestens 6 Zeichen lang sein und schützt später den Keystore vor unbefugter Benutzung. Nach der Eingabe des Passwort werden verschiedene Daten für das zu erzeugende Schlüsselpaar abgefragt. What is your first and last name? [Unknown]: Hugo Maier What is the name of your organizational unit? [Unknown]: FHTE What is the name of your organization? [Unknown]: Fachhochschule Esslingen What is the name of your City or Locality? [Unknown]: Esslingen What is the name of your State or Province? [Unknown]: Germany What is the two-letter country code for this unit? [Unknown]: DE Is correct? [no]: y

Abschließend muss noch ein Passwort für den Private Key gewählt werden. Wenn das gleiche Passwort wie für den Keystore gelten soll, so ist kein weiteres Passwort einzugeben, sondern einfach das vorhandene Passwort mit Return zu bestätigen. Enter key password for (RETURN if same as keystore password) :

Es erfolgen dann später auch keine separaten Passwortabfragen für diesen Schlüssel. Dies heißt jedoch nicht, dass der Schlüssel kein Passwort hat. Er hat nur dasselbe Passwort wie auch die Keystore-Datei und wird deshalb nicht separat abgefragt. Den Inhalt der Keystore-Datei kann man sich mit keytool -list ausgeben lassen. Nach einer Eingabeaufforderung für das Passwort des Keystores erfolgt dann die Ausgabe des Inhalts. Dieser sieht hier folgendermaßen aus: Keystore type: jks Keystore provider: SUN Your keystore contains 1 entry: maier, Sun Dec 05 15:12:41 GMT+01:00 1999, keyEntry, Certificate fingerprint (MD5): EF:98:66:4B:95:4D:28:B3:5E:26:4E:AD:43:7C:7D:3C

842

Anhang B

Mit keytool -list -v können weitere Informationen zu den Schlüsseleinträgen in der Keystore-Datei abgerufen werden. Keystore type: jks Keystore provider: SUN Your keystore contains 1 entry: Alias name: maier Creation date: Sun Dec 05 15:12:41 GMT+01:00 1999 Entry type: keyEntry Certificate chain length: 1 Certificate[l) : Owner: CN=Hugo Maier, OU=FHTE, 0= Fachhochschule Esslingen, L=Esslingen, ST=Germany, C=DE Issuer: CN= Hugo Maier, OU=FHTE, 0= Fachhochschule Esslingen, L= Esslingen, ST=Germany, C=DE Serial number: 384a72c8 Valid from: Sun Dec 05 15:12:24 GMT+01:00 1999 until: Sat Mar 04 15:12:24 GMT+01:00 2000 Certificate fingerprints: MD5: EF:98:66:4B:95:4D:28:B3:5E:26:4E:AD:43:7C:7D:3C SHA1: B1:81:2F:EB:41:2F:7A:62:C7:1F:2E:4B:22:BE:37:A9:7E:5A:E7:CB ******************************************* *******************************************

Jetzt, da ein Schlüsselpaar erzeugt ist, kann man dazu übergehen, Code zu signieren. Dies erfolgt mit dem Tool jarsigner.

B 4.2 Jarsigner Zum Signieren von Java-Code müssen sich die kompilierten . class-Files in einem jar-Archiv befinden. Der Aufruf zum Signieren eines test. jar Files ist relativ einfach: jarsigner -keystore myKeys test.jar maier Hierbei wird der private Schlüssel unter dem Alias "maier" aus der Keystore-Datei "myKeys" im aktuellen Verzeichnis verwendet. Nach Eingabe des Passworts für die Keystore-Datei und - wenn unterschiedlich - auch der Eingabe des Passworts für den spezifischen Schlüssel erfolgt die Signierung des j ar-Files.

B 4.3 Umgang mit Certification Authority-Zertifikaten Mit dem JDK 1.2 kann nun auch endlich mit CA-Zertifikaten umgegangen werden. Eine CA (Certification Authority) signiert ihrerseits einen public Schlüssel und bestätigt damit die Richtigkeit der Angaben, die zu einem Schlüssel gemacht wurden. Um einen sogenannten "Certificate Request" zu erzeugen, gibt es in keytool die Option -certreq. keytool -certreq -alias maier -file request -keystore myKeys Enter keystore password: testme

Java-Tools und -Laufzeitumgebung

843

Das von einer CA signierte Ergebnis kann dann in den Keystore importiert werden. Der angegebene Alias muss dabei vom alten Alias verschieden sein. keytool -import -alias maierCert -trustcacerts -file response Dies importiert das Zertifikat aus der Datei "response" in die Keystore Datei unter dem neuen Alias "maierCert". Die Option -trustcacerts weist keytool an, gegen die Root-Zertifikate zu verifizieren, die mit dem JDK ausgeliefert werden.

B 4.4 Schlüsselverteilung Um anderen zu ermöglichen die Signatur des j ar-Files zu prüfen, muss der public Schlüssel diesen Personen zugänglich gemacht werden. Um den Schlüssel zu verteilen, sieht keytool eine Export-Funktion vor. keytool -export -alias maier -file mykey -keystore myKeys Enter keystore password: testme Certificate stored in file Nun kann eine andere Partei diesen Schlüssel aus der Datei in die eigene KeystoreDatei importieren. Dies erfolgt mit der Option import: keytool -import -alias maier -file mykey Enter keystore password: testme Owner: CN=Hugo Maier, OU=FHTE, 0= Fachhochschule Esslingen, L=Esslingen, ST=Germany, C=DE Issuer: CN=Hugo Maier, OU=FHTE, 0= Fachhochschule Esslingen, L= Esslingen, ST=Germany, C=DE Serial number: 384a72c8 Valid from: Sun Dec 05 15:12:24 GMT+01:00 1999 until: Sat Mar 04 15:12:24 GMT+01:00 2000 Certificate fingerprints: MD5: EF:98:66:4B:95:4D:28:B3:5E:26:4E:AD:43:7C:7D:3C SRA1: B1:81:2F:EB:41:2F:7A:62:C7:1F:2E:4B:22:BE:37:A9:7E:5A:E7:CB Trust this certificate? [no]: y Certificate was added to keystore Damit ist der public Schlüssel in der Keystore Datei unter dem Alias "maier" als vertrauenswürdig gespeichert. Jetzt können Signaturen von j ar-Files, die mit dem privaten Schlüssel (dem Gegenstück zu diesem public Schlüssel) erstellt wurden, geprüft werden.

B 4.5 Policy Tool In JDK 1.1.x konnte Code von einer als vertrauenswürdig anerkannten Instanz alles tun. In JDK 1.2 ist das anderes. So hat das Speichern des Schlüssels und seine Anerkennung als vertrauenswürdig noch keinen weiteren Effekt. Damit der signierte Code von dieser Instanz auch besondere Rechte bekommt, wird eine Policy benötigt. Die Erstellung einer sicheren Policy ist ein komplexes Thema, auf das hier nicht genauer eingegangen werden kann. Es soll hier nur kurz auf die Erstellung einer

844

Anhang B

einfachen Policy eingegangen werden, wie sie nötig ist, um signierten Code einer bestimmten Instanz mit erweiterten Rechten auszuführen. Für die Erstellung einer Policy reicht ein simpler ASCII-Editor. Es gibt im JDK zwar ein Policytool genanntes Werkzeug für die Erstellung von Policy Dateien. Es lassen sich mit dem Policytool jedoch nicht alle Möglichkeiten ausschöpfen, so dass bei Kenntnis des Formats der Policy Datei die Erstellung mit einem normalen Editor vorzuziehen ist. Im Folgenden wird eine Policy Datei mit Namen "myPolicy" im aktuellen Verzeichnis (dem Verzeichnis, in dem sich auch die Keystore Datei befindet) mit einem normalen Editor erzeugt. Der erste Eintrag in dieser Policy Datei enthält den relativen Pfad zu unserer Keystore Datei "myKeys". Es folgt dann ein grant-Statement, welches Code, der vom Alias "maier" (wie in der Keystore Datei hinterlegt) signiert ist und von der entsprechenden Code Base kommt, das Recht zugesteht, alle Dateien in c: \ temp zu schreiben. Im zweiten grant-Statement wird von "schulze" signiertem Code, der sich lokal in c:\programme\java\ befindet, das Recht gewährt, alle Dateien unterhalb des Wurzelverzeichnisses c: \ zu lesen. keystore "myKeys"; grant signedBy "maier", codeBase .. http://www.nirgendwo.com/applets/ .. permission java.io.FilePermission "c:\\temp\\*",

"write";

};

grant signedBy "schulze", codeBase "file:/c:/programme/java/" { permission java.io.FilePermission "c:\\*",

"read";

};

Für eine Beschreibung der Syntax der Policy Datei siehe http://java.sun.com/products/jdk/1.21docs/guide/security/PolicyFiles.html Eine Auflistung aller verfügbaren Permission und deren Beschreibung kann unter http://java.sun.com/products/jdk/1.2/docs/guide/security/permissions.html gefunden werden.

Anhang C Gültigkeitsbereiche von Namen Unter dem GOltlgkeltsberelch eines einfachen Namens versteht man den Bereich im Programm, innerhalb dessen die Deklaration des Namens bekannt ist.

QualHizierte Namen dienen zum Zugriff auf die Komponenten eines Pakets und auf die Methoden und Datenfelder von Referenztypen wie einer Klasse oder Schnittstelle. Soll beispielsweise in einer Klasse eine Klasse eines anderen Pakets benutzt werden, so erfolgt der Zugriff mit Hilfe eines qualifizierten Namens. Ein qualifizierter Name besteht aus einem Namen, einem Punkt und einem Bezeichner. Hierbei versteht man unter einem Bezeichner einen einfachen Namen. Ähnliche Zugriffsformen sind die Zugriffe auf Datenfelder und Methoden von Objekten über Referenzen. Diese Zugriffe erfolgen auch mit Hilfe des PunktOperators. Bei den im folgenden erörterten Gültigkeitsbereichen geht es nicht um Zugriffe von außen, sondern um die Gültigkeit von Namen, die bei ihrer Deklaration, d.h. wenn sie dem Compiler bekannt gegeben werden, stets einfache Namen sind. Deklarationen können in Teilen ihres Gültigkeitsbereichs verdeckt werden durch andere Deklarationen mit demselben Namen. Wird der entsprechende Name durch eine weitere Einheit mit demselben Namen verdeckt, so ist der Name immer noch gültig, aber nicht sichtbar, da bei seiner Verwendung der Zugriff auf die verdeckende Einheit erfolgt. Ein Beispiel für das Verdecken ist das Verdecken eines Datenfeldes mit dem Namen x durch eine lokale Variable mit dem Namen x, oder das Verdecken einer Marke in einem äußeren Block durch eine Marke mit demselben Namen in einem inneren Block. Wird ein Name nicht verdeckt343 , so kann innerhalb des Gültigkeitsbereichs über den Namen auf die entsprechende Einheit Bezug genommen werden. Nicht immer führt ein gleicher Name dazu, dass ein anderer Name verdeckt wird. Durch die Verwendung von Kontexten kann Java Namenskonflikte minimieren. So dürfen beispielsweise Typen, Methoden und Datenfelder in Java denselben Namen tragen. Aus der Verwendung wird dabei klar, um was es sich jeweils handelt.

343

Das Überschreiben von Methoden und das Verdecken von Datenfeldern wird in Kap. 10.5 behandelt.

846

Anhang C

Man unterscheidet zwischen den Gültigkeitsbereichen: • • • • • • • •

von Paketen, von importierten Klassen und Schnittstellen, eines Klassen- oder Schnittstellennamens, von Datenfeldem und Methoden innerhalb einer Klasse oder einer Schnittstelle, von formalen Parametem einer Methode oder eines Konstruktors, von lokalen Variablen innerhalb eines Blocks. von lokalen Variablen, die In der Initiallsierungsklausel einer für-Schleife definiert werden, und eines Exceptlon-Parameters in einem catch-Block.

C 1 Pakete Pakete entsprechen Verzeichnissen in der Verzeichnisstruktur eines Speichermediums. Auf welche Pakete auf der obersten Ebene zugegriffen werden kann, d.h. welche Paketnamen auf der obersten Ebene gültig sind, wird durch Einstellungen auf der Betriebssystem-Ebene festgelegt.

C 2 Importierte Klassen und Schnittstellen Wird ein Klassenname oder ein Schnittstellenname in einer Übersetzungseinheit (Datei) importiert, so ist er ab der import-Vereinbarung in der ganzen Übersetzungseinheit sichtbar. Dies gilt für einen vollständig qualifizierten Namen wie z.B.: import java.awt.Frame; ebenso wie für die Verwendung von Wildcards import java.awt.*; Werden Wildcards verwendet, so werden alle entsprechenden public-Typen des genannten Pakets importiert, sofem sie benötigt werden. Die Gültigkeit der importierten Namen erstreckt sich nur auf die Datei, nicht auf das gesamte Paket.

C 3 Klassen- oder Schnittstellen namen Der Gültigkeitsbereich einer in einem Paket definierten Klasse oder Schnittstelle bezieht sich auf alle Übersetzungseinheiten (Dateien) des Pakets. Eine Vorwärtsdeklaration ist nicht erforderlich. In Kapitel 11.6 wurde für die Gültigkeit von Klassen ein Beispiel gegeben.

847

Gültigkeitsbereiche von Namen

C 4 Datenfelder und Methoden innerhalb einer Klasse oder einer Schnittstelle Wenn ein Attribut, d.h. ein Datenfeld oder eine Methode, in einer Klasse oder Schnittstelle definiert wird oder von der Klasse bzw. Schnittstelle geerbt wird, so ist das Attribut - unabhängig von der Reihenfolge der Attribute - in der gesamten Definition der Klasse bzw. Schnittstelle gültig, es sei denn, es wird ein Datenfeld zur Initialisierung eines Datenfeldes benutzt. Ist dies der Fall, dann muss das zur Initialisierung verwendete Datenfeld bereits selbst definiert sein, wenn es zur Initialisierung eines Datenfeldes herangezogen wird. Deshalb wird beim folgenden Beispiel ein Fehler erzeugt. II Datei: Inittest.java class Inittest {

int alpha int beta

LIJ 11

beta; Ilnicht zulaesssig 3;

Die Meldung des Compilers lautet: Inittest.java:3: Can't make forward reference to beta in class Inittest. int alpha beta; Ilnicht zulaesssig

=

Zulässig ist aber: II Datei. Inittest2.java class Inittest2.java {

Reihenfolgetest() {

alpha = 3; int beta 1; int alpha,

Ebenso ist zulässig: II Datei: Inittest3.java class Inittest3 {

int alpha = beta; atatic int beta 3;

=

da eine Klassenvariable bereits beim Laden initialisiert wird.

848

Anhang C

C 5 Formale Parameter Konstruktors

einer

Methode

oder

eines

Der Gültigkeitsbereich des Namens eines formalen Parameters ist der ganze Methodenrumpf. Es ist nicht zulässig, den Namen eines formalen Parameters zu verdecken, d.h. der Name eines formalen Parameters kann nicht für die Definition einer lokalen Variablen oder eines Exception-Parameters innerhalb der Methode verwendet werden. Auf formale Parameter kann nur unter Verwendung ihres einfachen Namens, nicht aber mit einem qualifizierten Namen Bezug genommen werden. Formale Parameter eines Konstruktors werden wie formale Parameter von Methoden behandelt.

C 6 Lokale Variablen innerhalb eines Blocks Der Gültigkeitsbereich einer lokalen Variablen ist der Rest des Blocks ab der Definition der Variablen einschließlich weiterer Definitionen im Rahmen ihrer Deklarationsanweisung. Lokale Variablen verlieren am Ende ihres Blockes ihre Gültigkeit.

C 7 Lokale Variablen in einer for-Anweisung Der Gültigkeitsbereich einer lokalen Variablen, die im Initialisierungskonstrukt einer for-Schleife definiert wird, erstreckt sich über die Ini tialisierungsklausel mit der eigenen Definition und den Definitionen rechts davon, über den Ausdruck BoolescherAusdruck, die Aktualisierungs-Ausdrucksliste und schließlich die Anweisung. An die Stelle der Anweisung kann ein Block treten. Nach der Schleife verlieren die in der Initialisierungsklausel definierten Variablen ihre Gültigkeit. Das folgende Beispiel demonstriert den Gültigkeitsbereich einer in der Initialisierungsklausel definierten lokalen Variablen i: // Datei: Calc.java class Calc {

public static void main (String [l args) {

for (int n = 10; n