background image

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 1 

 

3. Klasy w 

java.lang

 

 

3.1 Pakiet 

java.lang

  

3.2 Klasy 

Character, String, StringBuffer

 

3.3 Klasy dla typów liczbowych 
3.4 Tablice 
3.5 Klasa 

System

 

3.6 

Security Manager 

3.7 

Runtime 

 

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 2 

3.1 Pakiet 

java.lang

  

 

Wa

Ŝ

niejsze klasy pakietu 

java.lang

 

Object

 - klasa główna. 

 

Class

 - zapewnia opis klas podczas wykonania programu.  

 Klasy "opakowuj

ą

ce" typy liczbowe: 

Boolean, Character, Integer, Long, Float, Double  

 

Void

 - abstrakcyjna klasa zawiera referencje do obiektu typu 

Class

 dla 

typu prostego 

void

.  

 

Math

 - zawiera funkcje matematyczne, np.  

sin, cos, square root, min,

 

max

generator pseudolosowy

 

random().

  

 

String , StringB

uffer - operacje na napisach. 

 

 

ClassLoader,  Process,  Runtime,  SecurityManager,  System   

-  realizacja 

"operacji  systemowych"  jak:  dynamiczne  ładowanie  klas,  tworzenie 
zewn

ę

trznych  procesów,  zapytania  o  wasno

ś

ci  systemowe  i 

stosowanie zabezpiecze

ń

 

background image

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 3 

 

Throwable

 - klasa obiektów, które mog

ą

 by

ć

 zgłaszane we frazie 

throw

Klasa bazowa klas bł

ę

dów i wyj

ą

tków. 

 

Thread,  ThreadGroup

  -  klasy  dla  definiowania  wielow

ą

tkowego 

zachowania si

ę

 programu.  

 

Opis interfejsów: 

 

 

CharSequence

 

- sekwencja znaków która mo

Ŝ

e by

ć

 odczytana. 

 

Cloneable

  -  klasa  implementuj

ą

ca  ten  interfejs  deklaruje  (co  jest 

potrzebne  metodzie 

Object.clone()

)

Ŝ

e  mo

Ŝ

na  na  jej  obiektach 

wykona

ć

 kopiowanie pól składowa-po-składowej. 

 

Comparable

  -  wskazuje  na  istnienie  globalnego  uporz

ą

dkowania 

obiektów klasy implementuj

ą

cej interfejs. 

 

Runnable

 - ka

Ŝ

da klasa „typu w

ą

tek” powinna implementowa

ć

 metod

ę

 

tego interfejsu. 

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 4 

3.2 Klasy 

Character, String, StringBuffer

 

Klasy znakowe: 



 

Character (pojedynczy znak) 



 

String (niezmienne napisy) 



 

StringBuffer (zmienne napisy) 

 

Klasa Character

 - jeśli potrzebny jest obiekt zawierający pojedynczy znak a nie 

zmienna typu char. 
W poniŜszym przykładzie wywołuje się 

metody klasy Character



 

Character(char) - jedyny konstruktor klasy 



 

compareTo(Character) - porównuje argument z obiektem 



 

equals(Object) - porównuje wartości obiektów 



 

toString() - konwertuje obiekt do napisu 1-znakowego 



 

charValue() - zwraca znak przechowywany w obiekcie 



 

isUpperCase(char)  -  metoda  statyczna,  testująca  czy  argument  jest 
"górnym" znakiem . 

background image

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 5 

Przykład 3.1 

public class CharacterDemo { 
    public static void main(String args[]) { 
        Character a = new Character('a'); 
        Character a2 = new Character('a'); 
        Character b = new Character('b');
 
        int difference = a.compareTo(b); 
        if (difference 

==

 0) { 

            System.out.println("a jest równe b."); 
        } else if (difference <0) { 
            System.out.println("a jest mniejsze od b."); 
        } else if (difference >0) { 
            System.out.println("a jest większe od b."); 
        } 
        System.out.println("a jest " + 

 ((a.equals(a2)) ? "równe" : "nierówne") + " a2."); 

        System.out.println("Znak " + a.toString() + " jest " 
 + (Character.isUpperCase(a.charValue()) ? "górnym " : "dolnym ") 
 + "znakiem."); 

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 6 

    } 

 

Wynik programu: 

a jest mniejsze od b. 
a jest równe a2. 
Znak a jest dolnym znakiem. 

 

background image

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 7 

Klasa  String  -

  String  jest  klasą  w  Javie  a  nie  typem  literału  napisowego 

zakończonego znakiem końca literału \0. 

Przykład 3.2 

class strcpy { 
    public static void main(String[] args) { 
        String s = "HotJava is Cool!"; 
        StringBuffer t = new StringBuffer("Java is Cool!"); 
        System.out.println(s + ", " + t); 
        myStrCopy(t, s); 
        System.out.println(s + ", " + t); 
    } 
    static void myStrCopy ( StringBuffer dest, String src ) { 
        int i, len = src.length(); 
        for (i = 0; i < len; i++) 
            dest.setCharAt ( i, src.charAt(i) ); 
    } 

PoniewaŜ  nie  sprawdzamy  długości  dest  to  gdy  src  jest  dłuŜsze  od  dest 
zgłoszony zostanie wyjątek: 

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 8 

Exception in thread "main":  
java.lang.StringIndexOutOfRangeException  

 

Klasa  StringBuffer

  -  Klasa  String  przeznaczona  jest  dla  obiektów  stałych,  a 

klasa StringBuffer dla obiektów o zmiennej wartości. 

Przykład 3.3 

public class StringsDemo { 
    public static void main(String[] args) { 
        String palindrome = "Dot saw I was Tod"; 
        int len = palindrome.length(); 
        StringBuffer dest = new StringBuffer(len); 
        for (int i = (len - 1); i = 0; i--) { 
            dest.append(palindrome.charAt(i)); 
        } 
        System.out.println(dest.toString()); 
    } 

Wynik programu:  

doT saw I was toD 

background image

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 9 

 
Tworzenie obiektów klas String i StringBuffer  

Obiekt klasy String moŜna utworzyć: 
- przekazując literał napisowy podczas inicjalizacji zmiennej referencyjnej, np. 

String palindrome = "Dot saw I was Tod";

 // Inicjalizacja literałem 

albo  
- stosując konstruktor klasy w operatorze new, np.: 

char[] helloArray = { 'h', 'e', 'l', 'l', 'o' };

 // Tablica znaków 

String helloString = new String( helloArray );

 // Konstruktor otrzymuje 

   

 

 

 

 

 

 

 

 

   // tablicę znaków 

System.out.println ( helloString ); 

 
Obiekt klasy StringBuffer tworzy się operatorem new , np.: 

String palindrome = "Dot saw I was Tod"; 
int len = palindrome.length(); 
StringBuffer dest = new StringBuffer(len);

 // Nowy obiekt posiada  

   

// początkową rezerwację pamięci dla napisów o długości len. 

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 10 

Metody dostępu do składowych klas String i StringBuffer 

 



 

length()

  -  zwraca  liczbę  znaków  zawartych  w  obiekcie  klasy  String  lub 

StringBuffer. Np.: 

String palindrome = "Dot saw I was Tod"; 
int len = palindrome.length();

 // len = 17 



 

capacity()

 (tylko dla StringBuffer) 

Zwraca rozmiar zaalokowanego obszaru dla znaków obiektu, np. 

 



 

charAt(int)

 - zwraca znak o podanym indeksie: 0; 1, ...,  length() - 1. 

String anotherPalindrome = "Niagara. O roar again!";  
char aChar = anotherPalindrome.charAt(9); 

// zwróci znak 'O' 

 

background image

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 11 



 

String substring(int);   

   String substring(int, int);  

Zwraca nowy obiekt String będący podnapisem obiektu String lub StringBuffer 
-  1-szy  argument  podaje  indeks  pierwszego  znaku,  drugi  argument  -  indeks 
znaku ostatniego zwiększony o 1 (długość=arg2 - arg1). 
Np. 

String anotherPalindrome = "Niagara. O roar again!";  
String roar = anotherPalindrome.substring(11, 15);  

 

 



 

append(string)

  (tylko  w  StringBuffer)  -  dołączenie  napisu  -  wymaga 

ewentualnego rozszerzenia pamięci zaalokowanej dla znaków obiektu.  

Przykład 3.4 

class ReverseString { 
    public static String reverseIt(String source) { 
        int i, len = source.length(); 

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 12 

        StringBuffer dest = new StringBuffer(len); 
        for (i = (len - 1); i >= 0; i--) { 
            dest.append(source.charAt(i));

 

// Dołącz znak 

        } 
        return dest.toString(); 
    } 

Istnieje szereg metod append(typ), dla typów takich, jak floatintboolean, a 
takŜe Object - dane są konwertowane do literału napisowego przez dołączeniem 
ich do obiektu. 


 

insert(int,  string)

  (tylko  w  StringBuffer)  -  wstaw  napis  w  (środek)  znaków 

obiektu, przed znakiem o indeksie równym 1-szemu argumentowi. 

Np. 

StringBuffer sb = new StringBuffer("Drink Java!"); 
sb.insert(6, "Hot "); 

// Wstaw napis  

System.out.println(sb.toString()); 

Wydruk programu: 

Drink Hot Java! 

Tu równieŜ istnieje wiele wersji tej metody. 

background image

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 13 

 


 

setCharAt(int, znak) 

(w StringBuffer) 

Zastąp znak w obiekcie w podanym miejscu podanym znakiem. 

 

Metody dla konwersji typu do klasy String 

 

String toString (obiekt);   

Konwersja obiektu określonego typu na obiekt klasy String.  

Przykład 3.5 

class ReverseString { 
    public static String reverseIt(String source) { 
        int i, len = source.length(); 
        StringBuffer dest = new StringBuffer(len); 
        for (i = (len - 1); i >= 0; i--) {  dest.append(source.charAt(i)); } 
        return dest.toString()

// Konwersja obiektu dla wyniku metody 

    } 

Metoda  toString()  dziedziczona  jest  z  klasy  Object  i  kaŜda  klasa  moŜe 
posiadac własną wersję tej metody. 
 

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 14 

 

String valueOf (zmienna);  

(Metoda  klasowa  w  klasie  String).  Konwersja  zmiennej  dowolnego  typu 
(prostego) do obiektu klasy String.  
Np. 

System.out.println( String.valueOf(Math.PI) ); 

 

Konwersje z klasy String do typów liczowych 

 

typ_liczbowy valueOf(string

Klasa String nie posiada metod konwersji typów w drugą stronę - z typu String 
do  typów  liczbowych.  Ale  klasy  "obejmujące"  typy  proste  (Integer,  Double, 
Float, Long) posiadają metodę klasową valueOf(string). 
Np.  

String piStr = "3.14159"; 
Float pi = Float.valueOf ( piStr ); 

 

background image

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 15 

Związek klas String, StringBuffer z literałem napisowym 

 
Literały napisowe
 - np.:  "Hello World!" 
KaŜdy napotkany literał napisowy jest automatycznie konwertowany do obiektu 
klasy  String.  Dlatego  teŜ  literał  napisowy  moŜe  być  uŜyty  wszędzie  tam  gdzie 
wymagany jest obiekt klasy String. 
Np. jako argument 

System.out.println("Pozdrowienia od nowych gości."); 

Np. jako niejawnie tworzony obiekt: 

int len = "Goodbye".length(); 

Np. do inicjalizacji obiektu: 

String s = "Hola Mundo";

 // Bardziej efektywne niŜ następny wiersz. 

String s = new String("Hola Mundo");

 // Tu utworzymy dwa obiekty. 

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 16 

Konkatenacja napisów, operator  + 

Operator 

+

 umoŜliwia łączenie napisów, np.:  

String cat = "cat"; 
System.out.println("con" + cat + "enation");

 

 
Kompilator  korzysta  z  klasy  StringBuffer  do  implementacji  operacji  łączenia 
napisów.  
Np. powyŜszy fragment "zamieniany jest" niejawnie na: 

String cat = "cat"; 
System.out.println(new StringBuffer().append("con"). 
                       append(cat).append("enation").toString()); 

 
Operatorem 

+

 moŜna teŜ łączyć z obiektem klasy String wartości innych typów 

niŜ String, np.: 

System.out.println("Liczba " + 1);

 // Nastąpi niejawna konwersja liczby 

// 1 do obiektu klasy String i operacja konkatenacji. 

background image

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 17 

Przykład 3.6

 Wykonanie przypisania 

+=

 dla obiektów klasy String. 

 

//Program w C++ 

string*  s1 = new string("hello"); 
string*  s2 = s1; 
(*s1) += " world"; 
cout<<*s1<<endl<<*s2<<endl; 
return  0; 

//s1 = s2 = "hello world" 

 

// Program w Javie 

String s1 = "hello"; 
String s2 = s1; 
s1 += " world"; 
System.out.println(s1 + "\n" + s2); 

//s1 = "hello world", s2 = "hello" 

 
W  Javie  obiekty  typu  String  nie  mogą  być  modyfikowane,  więc  wykonanie 
operacji 

+

 utworzy nowy obiekt. 

Po wykonaniu 

+=

  powstaje róŜnica między obiektami s1, s2. 

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 18 

3.3 Klasy dla typów liczbowych 

Klasa Number zdefiniowana jest w java.lang . Dalsze klasy liczbowe
 

 

 
Istnieją teŜ klasy -"opakowania" dla innych typów danych: 
BooleanCharacterVoid
Rozszerzone operacje matematyczne zdefiniowane są w klasie Math
 

background image

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 19 

3.4 Tablice 

Rozmiar tablicy ustalany jest podczas wykonania programu. 

 

Przykład 3.7.

 Deklaracja i utworzenie tablicy: 

public class ArrayDemo { 
    public static void main(String[] args) { 
        int[] anArray;         

 

// Deklaracja tablicy elementów typu int  

        

anArray = new int[10];

 

// Utworzenie tablicy 10 elementów int 

        for (int i = 0; i < anArray.length; i++) { 
            anArray[i] = i;    
            System.out.print(anArray[i] + " "); 
        } 

// Przypisz wartośc elementom i wypisz je na wyjście  

        System.out.println(); 
    } 

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 20 

 

Definicja zmiennej referującej tablicę 

typ [] nazwaZmiennej 

 

Np. 

int[] anArray;

  

// Deklaracja zmiennej dla tablicy elementów int 

// Deklaracja zmiennych dla tablic innych typów 

float[] anArrayOfFloats; 
boolean[] anArrayOfBooleans; 
Object[] anArrayOfObjects; 
String[] anArrayOfStrings; 

 
Utworzenie tablicy 

new TypElementów[rozmiarTablicy

 
Np. 

anArray = new int[10];

  // Utworzenie tablicy 10 elementów int 

background image

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 21 

 
Dostęp do elementu tablicy 
Operator indeksowania: 

nazwaZmiennej[indeks]

 

 
Np. 

for (int i = 0; i < anArray.length; i++) { 
    anArray[i] = i; 
    System.out.print(anArray[i] + " "); 

 
Pobranie rozmiaru tablicy 

nazwaTablicy.length

  // length jest własnością obiektu. 

 
Inicjalizacja tablicy 
Definicja zmiennej referencyjnej z jednoczesną inicjalizacją tablicy: 
Np. 

boolean[] answers = { true, false, true, true, false }; 

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 22 

Tablica  obiektów

  -  element  tablicy  moŜe  być  typu  prostego  lub  typu 

klasy. 

 

Przykład 3.8 

public class ArrayOfStringsDemo { 
    public static void main(String[] args) { 
        String[] anArray = { "One", "Two", "Three" };

 

        for (int i = 0; i < anArray.length; i++) { 
            System.out.println ( anArray[i].toLowerCase()); 
        } 
    } 

Uwaga - w poniŜszej instrukcji nie zdefiniowano elementów tablicy: 

String[] anArray = new String[5];

 

// Tablica istnieje ale nie jej elementy 

for (int i = 0; i < anArray.length; i++) { 

    // BŁĄD: następna instrukcja spowoduje błąd wykonania  

    System.out.println(anArray[i].toLowerCase()); 

background image

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 23 

Tablica tablic  

Przykład 3.9 

public class ArrayOfArraysDemo { 
    public static void main(String[] args) { 
        String[][] cartoons = { 

// 4 pod-tablice o Ŝnych długościach

 

          { "Flintstones", "Fred", "Wilma", "Pebbles", "Dino" }, 
          { "Rubbles", "Barney", "Betty", "Bam Bam" }, 
          { "Jetsons", "George", "Jane", "Elroy", "Judy", "Rosie", "Astro"}, 
          { "SD Gang", "Scooby Doo", "Shaggy", "Velma", "Fred", "Daphne" } 

        };  

// Nazwy pod-tablic to: cartoons[0], cartoons[1], itd.  

        for (int i = 0; i < cartoons.length; i++) { 
            System.out.print(cartoons[i][0] + ": "); 
            for (int j = 1; j < cartoons[i].length; j++) { 
                  System.out.print(cartoons[i][j] + " "); 
            } System.out.println(); 
        } 
    }  

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 24 

 

Przykład 3.10

 Utworzenie pod-tablic bez jawnej inicjalizacji

public class ArrayOfArraysDemo2 { 
    public static void main(String[] args) { 
        int[][] aMatrix = new int[4][];

 

// Pierwszy wymiar (za wyjątkiem 

// ostatniego) musi (muszą) być jawnie podany. 

        for (int i = 0; i < aMatrix.length; i++) { 
             aMatrix[i] = new int[5]; 

// Utwórz pod-tablicę

 

             for (int j = 0; j < aMatrix[i].length; j++) { aMatrix[i][j] = i + j; } 
        } 

        // Wydrukuj tablicę tablic 

        for (int i = 0; i < aMatrix.length; i++) { 
            for (int j = 0; j < aMatrix[i].length; j++) { 
                 System.out.print(aMatrix[i][j] + " "); 
            } System.out.println(); 
        } 
    } 

background image

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 25 

Kopiowanie tablic

 - do tego słuŜy metoda 

arraycopy

 klasy 

System

public static void arraycopy( Object source,  int srcIndex
                   Object dest,  int destIndex,   int length

 

Przykład 3.11

 

public class ArrayCopyDemo { 
    public static void main(String[] args) { 
        char[] copyFrom = { 'd', 'e', 'c', 'a', 'f', 'f', 'e', 'i', 'n', 'a', 't', 'e', 'd' }; 
        char[] copyTo = new char[7]; 
        System.arraycopy(copyFrom, 2, copyTo, 0, 7); 
        System.out.println(new String(copyTo)); 
    } 

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 26 

 

 
Tablica  docelowa  musi  istnieć  i  być  wystarczająco  duŜa,  aby  pomieścić 
kopiowane dane. Inaczej powstanie błąd. 

background image

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 27 

3.5 Klasa 

System

 

1) Atrybuty programu – klasa 

Properties

 

Ś

rodowisko wykonania zawiera atrybuty systemowe

 komputer host, u

Ŝ

ytkownik, bie

Ŝą

ca kartoteka, system operacyjny. 

Zarz

ą

dza nimi klasa 

System

 
Program  w  Javie  posiada  te

Ŝ

  konfigurowalne  atrybuty  programu 

(preferencje), np.: opcje startowe, preferowany rozmiar okna. 

 

Atrybut posiada 2 cz

ęś

ci: 

nazwa

 i 

wartość

Np. "

os.name

" - nazwa atrybutu systemowego o warto

ś

ci b

ę

d

ą

cej nazw

ą

 

aktualnego systemu operacyjnego, np. "

Solaris

".  

 

Do ustawiania tych atrybutów słu

Ŝą

 3 mechanizmy: 

1.  własno

ś

ci (trwały zapis atrybutów od wykonania do wykonania), 

2.  argumenty linii komend (na czas wykonania aplikacji), 
3.  parametry apletu (na czas wykonania apletu). 

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 28 

Klasa "

Properties

" dla zarz

ą

dzania atrybutami programu 

 
Klasa 

Properties 

(w  pakiecie 

java.util

)  umo

Ŝ

liwia  zarz

ą

dzanie  zbiorem 

par 

klucz / wartość

.  

public class Properties extends Hashtable; 

 
Klasa 

System

  korzysta  z  obiektu  klasy 

Properties

  dla  zarz

ą

dzania 

własno

ś

ciami systemowymi.  

Równie

Ŝ

  ka

Ŝ

dy  program  w  Javie  mo

Ŝ

e  korzysta

ć

  z  obiektu  klasy 

Properties

 dla zarz

ą

dzania swoimi atrybutami programowymi. 

 
Uwaga: 
dost

ę

p do własno

ś

ci wymaga zgody "security manager-a". 

background image

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 29 

 

Czas 

Ŝ

ycia własno

ś

ci programu 

 

Start 

-

  Załadowanie domy

ś

lnych własno

ś

ci do obiektu 

Properties

 z zewn

ą

trz. 

-

  Program  tworzy  drugi  obiekt 

Properties

  i  ładuje  własno

ś

ci 

zapami

ę

tane po poprzednim wykonaniu si

ę

 programu. 

Program  sam  si

ę

  inicjalizuje  na  podstawie  domy

ś

lnych  i  pami

ę

tanych 

własno

ś

ci. 

 

Wykonywanie  

U

Ŝ

ytkownik  mo

Ŝ

e  zmieni

ć

  ustawienia,  np.  w  oknie  preferencji,  co 

poci

ą

ga za sob

ą

 modyfikacj

ę

 obiektu 

Properties

 

Zako

ń

czenie 

Program zapisuje swoje własno

ś

ci w dobrze znane sobie miejsce. 

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 30 

 

Ustawienia obiektów 

Properties 

// Utwórz i załaduj domyślne własności  

Properties defaultProps = new Properties(); 
FileInputStream in = new FileInputStream("defaultProperties"); 
defaultProps.load(in); 
in.close(); 

// Utwórz własności domyślne programu  

Properties applicationProps = new Properties(defaultProps); 

// Załaduj własności zapamiętane po poprzednim wykonaniu  

in = new FileInputStream("appProperties"); 
applicationProps.load(in); 
in.close(); 
. . . 

background image

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 31 

 

Zapami

ę

tanie własno

ś

ci  

Domy

ś

lne  własno

ś

ci  aplikacji nie zmieniaj

ą

 si

ę

, ale  inne trzeba zapisa

ć

 

przed zako

ń

czeniem programu. 

FileOutputStream out = new FileOutputStream("appProperties"); 
applicationProps.store(out, "---No Comment---"); 
out.close(); 

 

Metody klasy 

Properties

 dla pobrania informacji o własno

ś

ciach:  

 

contains (Object value

 

containsKey (Object key)

   

- zwracaj

ą

 "true

" gdy 

value 

lub 

key 

wyst

ę

puj

ą

 

w

 

obiekcie 

Properties; 

przekaza

ć

 do nich nale

Ŝ

y obiekty klasy 

String.  

 

 

getProperty(String key

 

getProperty(String  key,  String  default) 

-  zwraca  warto

ść

  dla  podanej 

własno

ś

ci;  w  drugiej  wersji  mo

Ŝ

na  przekaza

ć

  warto

ś

c  domy

ś

ln

ą

 

zwracan

ą

  wtedy, gdy własno

ś

ci nie ma.  

 

 

list(PrintStream s

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 32 

 

list(PrintWriter w) -

 zapisuje wszystkie własno

ś

ci do strumienia.  

 

elements() 

 

keys() 

 

propertyNames()

 - zwraca enumeracj

ę

 kluczy lub warto

ś

ci zawartych w 

obiekcie 

Properties

.  

 

 

size()

  - zwraca liczb

ę

 par 

klucz / wartość

.  

 

Ustawienie własno

ś

ci 

Metody klasy 

Properties

 dla zmiany informacji o własno

ś

ciach:  

 

put(Object  key,  Object  value)    

zapisuje  par

ę

 

klucz/wartość

  do  obiektu 

klasy

 Properties.  

 

remove(Object 

key)    -  usuwa  par

ę

 

klucz/wartość

  dla  zadanego  klucza. 

Nale

Ŝ

y przekaza

ć

 obiekty klasy 

String.

  

 
Przykład - program Bingo. 

background image

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 33 

2) Argumenty linii komend  

Aplikacja Javy przyjmie dowoln

ą

 liczb

ę

 argumentów w linii komendy. Np.  



  tryb  "

verbose

"  -  wy

ś

wietlanie  informacji 

ś

ledz

ą

cej  wykonanie 

programu uzyskujemy dzi

ę

ki opcji  

-verbose

.  

 
Np.  aplikacja  o  nazwie

  Sort

  ma  sortowa

ć

  wiersze  w  pliku, 

przekazywanym w linii komend:  

java Sort friends.txt 

 
Argumenty  przekazywane  s

ą

  w  postaci  tablicy  obiektów  klasy 

String

  - 

ka

Ŝ

dy 

String

 jest jednym argumentem linii komend. 

 

W programie mo

Ŝ

na okre

ś

li

ć

 liczb

ę

 argumentów , np.:

 

  

numberOfArgs = args.length; 

 

Nazwa  klasy  nie  jest  przekazywana  do  aplikacji  -  i  tak  j

ą

  znamy  bo 

odpowiada klasie o metodzie

 main().

  Np. 

java diff file1 file2  

Argumentami s

ą

 jedynie 

file1

 i 

file2

 

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 34 

Przykład.

 Echo dla argumentów linii komend: 

public class Echo { 
    public static void main (String[] args) { 
        for (int i = 0; i < args.length; i++)   System.out.println(args[i]); 
    } 

 

Dla komendy:  

java Echo Drink Hot Java 

wy

ś

wietli si

ę

 

Drink 
Hot 
Java 

Dla komendy z 1-ym argumentem: 

java Echo "Drink Hot Java" 

wy

ś

wietli si

ę

 

Drink Hot Java 

 

 

background image

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 35 

 

Zamiana argumentu linii komend na liczb

ę

  

Je

ś

li  przekazano  do  programu  liczb

ę

  w  linii  komend,  to  nale

Ŝ

y  zmieni

ć

 

obiekt 

String 

na liczb

ę

.  

Np. zamiana na 

int

:  

int firstArg; 
if (args.length > 0) 
    firstArg = Integer.parseInt(args[0]); 

 
parseInt

  zgłasza  wyj

ą

tek 

NumberFormatException

  gdy  format 

args[0]

 

jest niewła

ś

ciwy.  

 
Klasy  liczbowe  - 

Integer,  Float,  Double

,  itd.  -  posiadaj

ą

  metody 

parseXXX

  dla  konwersji  typu 

String

  reprezentuj

ą

cego  liczb

ę

  na  obiekt 

ich typu. 

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 36 

3) Korzystanie z klasy 

System

  

Klasa 

System

  umo

Ŝ

liwia  dost

ę

p  programu  do  zasobów  systemowych 

stanowi

ą

c API  niezale

Ŝ

ne od konkretnego systemu operacyjnego. 

Czasami  program  mo

Ŝ

e  posłu

Ŝ

y

ć

  si

ę

  obiektem  klasy 

Runtime

 

stanowi

ą

cym API zale

Ŝ

ne od systemu operacyjnego. 

Wszystkie metody i pola klasy 

System

 s

ą

 klasowe (statyczne) - nie ma 

obiektów klasy 

System

, do jej składowych odwołujemy si

ę

 poprzez klas

ę

public final class System  extends Object  

Klasa jest ostateczna (

final)

 a wszystkie jej konstruktory s

ą

 prywatne

Np. odwołania do składowych: 

    class UserNameTest { 
    public static void main(String[] args) { 
        String name; 
        name = System.getProperty("user.name"); 

// własność 

        System.out.println(name); 

// obiekt składowy klasy PrintStream 

    } 

 

background image

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 37 

Standardowe strumienie wej

ś

cia-wyj

ś

cia  

W klasie 

java.lang.System

 zdefiniowano trzy strumienie tekstowe : 

 standardowy strumie

ń

 wej

ś

ciowy 

System.in

,  

 standardowy strumie

ń

 wyj

ś

ciowy  

System.out

 i  

 standardowy strumie

ń

 bł

ę

dów 

System.err .

 

System.out

  i 

System.err

  dziedzicz

ą

  z  klasy 

PrintStream

,  w  tym  jej  trzy 

metody dla zapisu tekstu do strumienia:  

print, println, write

.  

Np. metody 

print

 i 

println

 s

ą

 zbli

Ŝ

one do siebie: 

System.out.print("Duke is not a penguin!\n"); // 
System.out.println("Duke is not a penguin!"); 

// RównowaŜne 

 
Metoda 

write

 słu

Ŝ

y do zapisu bajtów do strumienia. 

 
Argument metod 

print

 lub 

println

 mo

Ŝ

e by

ć

 typu: 

Object, String, char[], int, long, float, double, boolean.  

Istnieje te

Ŝ

 bezargumentowa wersja metody 

println

, która zapisuje znak 

ko

ń

ca linii do strumienia. 

 

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 38 

Przykład 

Zapis ró

Ŝ

nych danych do standardowego strumienia wyj

ś

ciowego.  

public class DataTypePrintTest { 
    public static void main(String[] args) { 
 
        Thread objectData = new Thread(); 
        String stringData = "Java Mania"; 
        char[] charArrayData = { 'a', 'b', 'c' }; 
        int integerData = 4; 
        long longData = Long.MIN_VALUE; 
        float floatData = Float.MAX_VALUE; 
        double doubleData = Math.PI; 
        boolean booleanData = true; 
 
        System.out.println(objectData); 
        System.out.println(stringData); 
        System.out.println(charArrayData); 
        System.out.println(integerData); 
        System.out.println(longData); 

background image

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 39 

        System.out.println(floatData); 
        System.out.println(doubleData); 
        System.out.println(booleanData); 
    } 

Wynik wykonania programu:  

Thread[Thread-4,5,main] 
Java Mania 
abc 

-9223372036854775808 
3.40282e+38 
3.14159 
true 

Zauwa

Ŝ

my, 

Ŝ

e "wydrukowanie" obiektu klasy 

Thread

 dało napis: 

KlasaWątku[Nazwa, priorytet, grupa] 

 

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 40 

Własno

ś

ci klasy 

System 

Klasa  System  posiada  szereg  własno

ś

ci  (w  postaci  par  klucz/warto

ść

), 

które 

wyznaczaj

ą

 

cechy 

lub 

atrybuty 

aktualnego 

ś

rodowiska 

wykonywania programu, np. aktualny u

Ŝ

ytkownik, wersja 

ś

rodowiska. 

 
Lista własno

ś

ci po inicjalizacji systemu czasu wykonania: 

Klucz 

Znaczenie 

"file.separator" 

Separator dla pliku (np. "/") 

"java.class.path" 

Java classpath 

"java.class.version" 

Wersja klas Javy  

"java.home" 

Kartoteka instalacji Javy 

"java.vendor" 

Napis specyficzny dla producenta Javy 

"java.vendor.url" 

URL producenta Javy 

"java.version" 

Wersja Javy 

"line.separator" 

Separator wiersza 

"os.arch" 

Architektura systemu operacyjnego 

"os.name" 

Nazwa systemu operacyjnego  

"os.version" 

Wersja systemu operacyjnego 

background image

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 41 

"path.separator" 

Separator dla 

ś

cie

Ŝ

ki (np. ":") 

"user.dir" 

Katalog bie

Ŝą

cy u

Ŝ

ytkownika 

"user.home" 

Katalog domowy u

Ŝ

ytkownika  

"user.name" 

Nazwa konta u

Ŝ

ytkownika 

 

Mo

Ŝ

na  odczytywa

ć

  i  zapisywa

ć

  warto

ś

ci  własno

ś

ci  a  tak

Ŝ

e  zmienia

ć

 

zestaw własno

ś

ci systemu. 

 

Uwaga:  Aplety  nie  maj

ą

  dost

ę

pu  do  wszystkich  własno

ś

ci  systemu. 

Aplety nie mog

ą

 zapisywa

ć

 własno

ś

ci systemu. 

 

Odczyt własno

ś

ci systemu 

getProperty  

- zwraca napis

 

getProperties 

- zwraca obiekt klasy 

Properties  

 

Np. 

System.getProperty("path.separator");  

Pobiera  warto

ść

  własno

ś

ci  "

path.separator

"  w  postaci  napisu.  Gdy 

własno

ść

  nie  istnieje  zwraca 

null

.  W  wersji  2-argumentowej  w  sytuacji 

ę

du zwraca warto

ść

 2 argumentu. 

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 42 

System.getProperty("subliminal.message", "Błędna własność"); 

Druga  metoda  zwraca  obiekt  klasy 

Properties

  zawieraj

ą

cy  wszystkie 

pary klucz/warto

ść

 dla własno

ś

ci systemu. 

System.getProperties;  

Zapis własno

ś

ci systemu  

setProperties

  -  pobiera  obiekt  klasy 

Properties

  i  zast

ę

puje  cały  zbiór 

własno

ś

ci systemu własno

ś

ciami znajduj

ą

cymi si

ę

 w tym obiekcie. 

 

Przykład.

  Utworzenie  obiektu 

p

  klasy 

Properties

  i  przekazanie  go  po 

rozszerzeniu o nowe własno

ś

ci jako argument do 

setProperties

:  

import java.io.FileInputStream; 
import java.util.Properties; 
public class PropertiesTest { 
    public static void main(String[] args) throws Exception { 

// Pobierz dane dla nowego obiektu własności z pliku  "myProperties.txt" 

        FileInputStream propFile = new FileInputStream( "myProperties.txt"); 
        Properties p = new Properties(System.getProperties());  

// Dodaj wczytane własności do istniejących własności systemu  

        p.load(propFile); 

background image

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 43 

// Ustaw na nowo własności systemu  

        

System.setProperties(p);

 

// PrzekaŜ obiekt jako argument

 

// Wyświetl nowo ustawion własności 

        System.getProperties().list(System.out); 
    } 

Uwaga:  stworzenie  pustego  obiektu  jest  mo

Ŝ

liwe,  ale  poci

ą

gn

ę

łoby  za 

sob

ą

 w tym przykładzie usuni

ę

cie własno

ś

ci systemu: 

Properties p = new Properties(); 

Uwaga:  je

ś

li  plik 

myProperties.txt

  zawiera  now

ą

  warto

ś

c  dla  istniej

ą

cej 

własno

ś

ci systemu, np. 

java.vendor

, to zgubimy star

ą

 warto

ść

, np.: 

java.vendor = Acme Software Company 

Zmiana własno

ś

ci systemu ma charakter nietrwały, obowi

ą

zuje tylko do 

zako

ń

czenia  interpretacji  danej  aplikacji. 

Ś

rodowisko  re-inicjalizuje 

własno

ś

ci systemu za ka

Ŝ

dym uruchomieniem interpretera. 

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 44 

Wymuszenie finalizacji i "garbage collectora" 

Garbage  Collector

  wykonuje  si

ę

  cyklicznie,  ale  na  chwil

ę

  usuni

ę

cia 

obiektów  z  pami

ę

ci  nie  mamy  wpływu  -  odbywa  si

ę

  to  w  tle.  Jest  to 

niekorzystne, gdy trzeba zwolni

ć

 tzw. zarz

ą

dzalne zasoby. 

Mo

Ŝ

na wymusi

ć

 usuni

ę

cie nieu

Ŝ

ywanych obiektów poprzez: 

 wywołanie metody 

gc

 w klasie 

System

, lub 

 wywołanie metody 

runFinalization

 w klasie 

System

 

Bezpo

ś

rednio  przed  usuni

ę

ciem  obiektu 

ś

rodowisko  interpretera 

wywołuje  metod

ę

 

finalize

  zwalnianego  obiektu.  Mo

Ŝ

na  w  niej 

zdefiniowa

ć

 kod "czyszcz

ą

cy" zwi

ą

zany z obiektem. 

 

Mo

Ŝ

na  te

Ŝ

  wymusi

ć

  "finalizacj

ę

"  dla  wszystkich  "nieu

Ŝ

ywanych" 

obiektów - wołaj

ą

c metod

ę

 

runFinalization

 : 

System.runFinalization()

Wywoła metody 

finalize

 dla wszystkich "nieu

Ŝ

ywanych" obiektów. 

W ka

Ŝ

dej chwili mo

Ŝ

na wywoła

ć

 "garbage collector-a": 

System.gc(); 

background image

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 45 

Inne metody klasy 

System

 

 

arraycopy

  - efektywne kopiowanie zawarto

ś

ci jednej tablicy do drugiej.  

 

currentTimeMillis

   -   podaje  upływ  czasu  wyra

Ŝ

ony  milisekundach  od 

chwili - 00:00:00, w dniu 1 stycznia 1970 r. - do chwili obecnej. 

 

Przykład 

Aplet 

TimingIsEverything

  korzysta  z  metody 

currentTimeMillis

  w  celu 

okre

ś

lenia odst

ę

pu czasu pomi

ę

dzy dwoma klikni

ę

ciami myszy. Je

ś

li ten 

odst

ę

p  jest  mniejszy  ni

Ŝ

  200  milisekund,  to  te  dwa  klikni

ę

cia 

interpretowane s

ą

 jako jedno podwójne klikni

ę

cie. 

import java.awt.Graphics; 
import java.awt.Dimension; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
public class TimingIsEverything extends java.applet.Applet { 
    public long firstClickTime = 0; 
    public String displayStr; 
    public void init() { 

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 46 

        displayStr = "Double Click Me"; 
        addMouseListener(new MyAdapter()); 
    } 
    public void paint(Graphics g) { 
        g.drawRect(0, 0, getSize().width-1, getSize().height-1); 
        g.drawString(displayStr, 40, 30); 
    } 
    class MyAdapter extends MouseAdapter { 
        public void mouseClicked(MouseEvent evt) { 
            long clickTime = System.currentTimeMillis(); 
            long clickInterval = clickTime - firstClickTime; 
            if (clickInterval < 300) { 
                displayStr = "Double Click!! (Interval = "+ clickInterval + ")"; 
                firstClickTime = 0; 
            } else { 
                displayStr = "Single Click!!"; 
                firstClickTime = clickTime; 
            } 
            repaint(); 

background image

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 47 

      } 
    } 

Uwaga: Aktualn

ą

 dat

ę

 i czas uzyskujemy poprzez klas

ę

 

java.util.Date

 

 

exit

  -  metoda  ta  powoduje  zako

ń

czenie  pracy  interpretera  Javy,  nie 

tylko  wykonywania  si

ę

  naszego  programu  -  jako  argument  podajemy 

kod przekazywany przez interpreter na zako

ń

czenie, np.: 

System.exit(-1); 

Uwaga: 
takie wywołanie z wewn

ą

trz apletu zwykle spowoduje wyj

ą

tek  

SecurityException

.  

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 48 

3.6 Własny "

Security Manager

"  

 

"

Security  manager

"  jest  to  obiekt  aplikacji,  który  zezwala  na  wykonanie 

si

ę

 potencjalnie niebezpiecznych operacji. Klasy biblioteczne pytaj

ą

 go o 

pozwolenie na wykonanie okre

ś

lonych operacji.  

 

Klasa 

System

 umo

Ŝ

liwia nam dost

ę

p do i zmian

ę

 tego obiektu.   

 
Definiuj

ą

c  klasy  pochodne  od  klasy 

java.lang.SecurityManager

  mo

Ŝ

emy 

stosowa

ć

 ró

Ŝ

ne polityki bezpiecze

ń

stwa. 

 
Uwaga:  "

Security  manager

"  mo

Ŝ

e  by

ć

  tylko  raz  ustalony  dla  jednej 

aplikacji.  Próba  ponownego  ustawienia  go  spowoduje  wyj

ą

tek 

SecurityException.

 

background image

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 49 

Wprowadzenie 

Klasa 

SecurityManager

  wyst

ę

puje  w  pakiecie 

java.lang

  i  jest  klas

ą

 

abstrakcyjn

ą

 
Aplikacja  nie  posiada 

Ŝ

adnego  domy

ś

lnego  "security  manager-a",  musi 

go utworzy

ć

 zainstalowa

ć

 
Mo

Ŝ

na  pobra

ć

  aktualnego  "security  manager-a"  dla  aplikacji  metod

ą

 

getSecurityManager()

, np.:  

SecurityManager appsm = System.getSecurityManager(); 

Je

ś

li nie ma "security manager-a" to metoda zwraca 

null

 
Maj

ą

c dost

ę

p do "security manager-a" mo

Ŝ

emy "zapyta

ć

" o pozwolenie 

wykonania operacji.  
 
Np.  metoda 

System.exit()

  ko

ń

czy  wykonywanie  interpretera  Javy,  ale 

przedtem pyta "security manager-a" poprzez jego metod

ę

 

checkExit()

 o 

pozwolenie na operacj

ę

 zako

ń

czenia: 

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 50 

SecurityManager security = System.getSecurityManager(); 
if (security != null) { 
    security.checkExit(status); 

// Kontynuacja, gdy metoda checkExit() zakończy się normalnie. 

Pozytywna  odpowied

ź

  jest  równowa

Ŝ

na  normalnemu  zako

ń

czeniu 

metody  checkExit()

.  Gdy  "security  manager"  "nie  zgadza  si

ę

"  na 

wykonanie  operacji  wtedy  metoda 

checkExit() 

zgłasza  wyj

ą

tek 

SecurityException

.  

 

Inne metody klasy 

SecurityManager

:

 

 

checkAccess()

 - sprawdza dost

ę

p dla w

ą

tków, 

 

checkPropertyAccess()

 - sprawdza dost

ę

p do zadanej własno

ś

ci  

 dalsze metody typu 

checkXXX()

 - gdzie 

XXX

 oznacza operacj

ę

 
Metody  te  s

ą

  ju

Ŝ

  wykorzystywane  przez  klasy  pakietów  Javy  i  program 

u

Ŝ

ytkownika zwykle nie musi ich wywoływa

ć

background image

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 51 

Napisanie "Security Manager-a"  

Nale

Ŝ

y utworzy

ć

 klas

ę

 pochodn

ą

 od 

SecurityManage

 i nadpisa

ć

 metody, 

które maj

ą

 by

ć

 inaczej wykonywane ni

Ŝ

 dziedziczone. 

 

Przykład 

Nasza klasa 

PasswordSecurityManager

 wprowadza restrykcyjny dost

ę

p do 

plików  zewn

ę

trznych,  co  wymaga  nadpisania  metod 

checkRead()  i 

checkWrite() . 

class PasswordSecurityManager extends SecurityManager { 
    . . . 

W  naszej  klasie 

PasswordSecurityManager

 

zadeklarujemy  prywatne  pole 

password

 zawieraj

ą

ce hasło, które u

Ŝ

ytkownik musi poda

ć

 dla uzyskania 

dost

ę

pu do pliku. Hasło ustawiane jest w konstruktorze: 

PasswordSecurityManager(String password) { 
    super(); 
    this.password = password; 

Prywatna metoda 

accessOK()

 komunikuje si

ę

 z u

Ŝ

ytkownikiem, uzyskuje 

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 52 

od niego hasło i sprawdza jego poprawno

ść

private boolean accessOK() { 
    int c; 
    DataInputStream dis = new DataInputStream(System.in); 
    String response; 
    System.out.println("Podaj hasło!"); 
    try { 
        response = dis.readLine(); 
        if (response.equals(password)) 
            return true; 
        else 
            return false; 
    } catch (IOException e) { 
        return false; 
    } 
}  
 

W  klasie 

PasswordSecurityManager

 

nadpisano  3  metody 

checkRead()

  i  2 

metody 

checkWrite()

 : 

background image

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 53 

public void checkRead(FileDescriptor filedescriptor) { 
    if (!accessOK()) 
        throw new SecurityException("Not a Chance!"); 

public void checkRead(String filename) { 
    if (!accessOK()) 
        throw new SecurityException("No Way!"); 

public void checkRead(String filename, Object executionContext) { 
    if (!accessOK()) 
        throw new SecurityException("Forget It!"); 

public void checkWrite(FileDescriptor filedescriptor) { 
    if (!accessOK()) 
        throw new SecurityException("Not!"); 

public void checkWrite(String filename) { 
    if (!accessOK()) 
        throw new SecurityException("Not Even!"); 

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 54 

Wszystkie powy

Ŝ

sze metody wywołuj

ą

 prywatn

ą

 metod

ę

 

accessOK().

 

 
Uwaga:  domy

ś

lne  definicje  metod 

checkXXX()  w  klasie  SecurityManager 

zgłaszaj

ą

 zawsze wyj

ą

tek 

SecurityException

.  

background image

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 55 

Instalowanie własnego "Security Manager-a"  

Wykorzystuje  si

ę

  do  tego  celu  metod

ę

 

setSecurityManager()

  w  klasie 

System

.  

 

Przykład 

Nasza  aplikacja 

SecurityManagerTest

  instaluje 

PasswordSecurityManager

 

(klasa z poprzedniego przykładu) jako aktualnego "security manager-a". 
Nast

ę

pnie,  dla  sprawdzenie  jego  istnienia  i  poprawnej  pracy,  aplikacja 

otwiera dwa pliki i przepisuje zawarto

ś

c jednego z nich do drugiego. 

 
Metoda 

main()

 klasy 

SecurityManagerTest

 

// Instaluj "security manager-a

try { 
System.setSecurityManager ( new PasswordSecurityManager ("Hip Hop")); 
} catch (SecurityException se) { 

    System.out.println("Istnieje juŜ zanistalowany SecurityManager!"); 

 

W dalszej cz

ęś

ci - kopiowanie pliku 

inputtext.txt

 do pliku 

outputtext.txt

try { 

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 56 

    DataInputStream fis = new DataInputStream( 
                                  new FileInputStream("inputtext.txt")); 
    DataOutputStream fos = new DataOutputStream( 
                                   new FileOutputStream("outputtext.txt"));
 
    String inputString; 
    while ((inputString = fis.readLine()) != null) { 
   

fos.writeBytes(inputString); 

   

fos.writeByte('\n'); 

    } 
    fis.close(); 
    fos.close(); 
catch (IOException ioe) { 
    System.err.println("I/O failed for SecurityManagerTest."); 

 

Przykład wyniku wykonania aplikacji

 SecurityManagerTest : 

Podaj hasło! 
Hip Hop 
Podaj hasło! 

background image

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 57 

Złe hasło 
java.lang.SecurityException: Not Even! 
  at

 

PasswordSecurityManager.checkWrite(PasswordSecurityManager.java:46) 
  at java.io.FileOutputStream.(FileOutputStream.java) 
  at SecurityManagerTest.main(SecurityManagerTest.java:15) 

 

 

Domy

ś

lne implementacje metod w klasie 

SecurityManager

:  

public void checkXXX(. . .) { 
    throw new SecurityException(); 

Czyli nie zezwalaj

ą

 one na 

Ŝ

adn

ą

 operacj

ę

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 58 

Jakie metody klasy 

SecurityManager

 nale

Ŝ

y nadpisa

ć

?  

Pierwsza  kolumna  to  obiekty,  na  których  wykonywane  s

ą

  operacje.  Druga 

kolumna  to  metody  klasy 

SecurityManager

,  które  słu

Ŝą

  do  sprawdzania 

operacji na tych obiektach. 

 

Operacje na obiekcie       Sprawdzane przez metod

ę

  

gniazdka  

 

 

 

checkAccept(String host, int port

                      

 

 

checkConnect(String host, int port

                       

 

 

checkConnect (String host, int port,  

 

 

 

 

 

 

 

 

 

Object executionContext

                       

 

 

checkListen(int port

 

wątki             

 

 

checkAccess(Thread thread

                       

 

 

checkAccess(ThreadGroup threadgroup

 

class loader      

 

 

checkCreateClassLoader() 

system plików       

 

checkDelete(String filename

                        

 

 

checkLink(String library

                        

 

 

checkRead(FileDescriptor filedescriptor

                        

 

 

checkRead(String filename

background image

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 59 

                        

 

 

checkRead(String filename,  

 

 

 

 

 

 

 

 

 

Object executionContext

                        

 

 

checkWrite(FileDescriptor filedescriptor

                        

 

 

checkWrite(String filename

 

rozkazy systemu   

 

checkExec(String command

interpreter       

 

 

checkExit(int status

 

pakiet            

 

 

checkPackageAccess(String packageName

                       

 

 

checkPackageDefinition(String packageName

 

własności        

 

 

checkPropertiesAccess() 

                        

 

 

checkPropertyAccess(String key

                        

 

 

checkPropertyAccess(String key, String def

sieć        

 

 

 

checkSetFactory() 

okna             

 

 

checkTopLevelWindow(Object window

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 60 

3.7 Obiekt klasy 

Runtime

 

Wi

ę

kszo

ść

 potrzeb aplikacji dost

ę

pu do systemu obsługuje klasa 

System

W  rzadkich  przypadkach  aplikacja  mo

Ŝ

e  odwoła

ć

  si

ę

  bezpo

ś

rednio  do 

ś

rodowiska czasu wykonania.

 

public class Runtime extends Object 
 

 

 
Ka

Ŝ

da  aplikacja  w  Javie  posiada  jeden  (niejawnie  utworzony)  obiekt 

klasy 

Runtime

, stanowi

ą

cy sprz

ę

g aplikacji ze 

ś

rodowiskiem wykonania. 

Obiektu tej klasy nie mo

Ŝ

na jawnie utworzy

ć

 w programie. 

 

background image

3. Klasy w java.lang 

W. Kasprzak: Programowanie zdarzeniowe 

3 - 61 

Dost

ę

p do obiektu uzyskujemy poprzez metod

ę

 

getRuntime

 public static Runtime getRuntime() ;  

// Zwraca aktualny obiekt Runtime

 

 

Obiekt 

Runtime

 dostarcza dwóch usług:  

 komunikacja  z  komponentami 

ś

rodowiska  czasu  wykonania  - 

pobieranie danych i wywoływanie funkcji. 

 zapewnienie  sprz

ę

gu  z  funkcjami  zale

Ŝ

nymi  od  systemu,  np.  z 

funkcjami 

getenv

 i 

setenv

 w systemie 

UNIX