05 JTPAdnotacje Odbijaniee JVM


Odbijanie (ang. Reflexivity)
Odbijanie (ang. reflexivity) pozwala na uzyskanie informacji o
klasach i obiektach oraz manipulowanie nimi w czasie
wykonania programu, w szczególności:
JTP: Odbijanie (Reflection)
ustalenie klasy obiektu,
ustalenie sygnatury klasy, t.j. atrybutów, metod,
konstruktów, ich dostępności i typów.
utworzenie elementu klasy, której nazwa jest nieznana w
czasie kompilacji,
wykonanie metody, której nazwa nie jest znana w czasie
Dr. Piotr Kosiuczenko
kompilacji.
1 2
JTP
JTP Dr Piotr Kosiuczenko
Odbijanie Odbijanie : Podstawowe Metody
metoda klasy Object
Class c = foo.getClass()
Dla każdej klasy JRE (Java Runtime Environment) tworzy
niemodyfikowalny obiekt zawierający informacje o tej klasie.
Po wykonaniu tej instrukcji c będzie zawierać obiekt
Ten obiekt odbija tę klasę. odpowiadający klasie, do której należy foo.
Uzyskanie informacji o danej klasie jest możliwe właśnie
poprzez ten obiekt.
Class s = c.getSuperclass();
Obiekt ten należy do klasy java.lang.Class.
s będzie zawierać obiekt odpowiadający nadklasie klasy
Dokładniej obiekt ten zawiera informacje o:
odpowiadajacej obiektowi c.
sygnaturze klasy (tj. atrybutach i metodach),
Obiektów odpowiadajacych klasom mozna szukac poprzez
meta klasach, nazwy tych klas:
implementowanych interfejsach. Class c = Class.forName( Foo );
Jest ona równoważna instrukcji Class c = Foo.class;
3 4
JTP Dr Piotr Kosiuczenko JTP Dr Piotr Kosiuczenko
Odbijanie : Introspekcja Odbijanie
Dostęp do obiektu klasowego odpowiadającego klasie obiektu foo:
Polecenie:
Class c = foo.getClass();
Class c = foo.getClass();
Dostęp do obiektu klasowego odpowiadajacego klasie FooClass:
Class c = FooClass.class;
metoda klasy Object
Dostęp za pomocą nazwy:
jest równoważne:
Class c = Class.forName( mysteryClass );
Class c =
Dostęp do nadklasy:
Class.forName(foo.getClass().getName());
Class s = c.getSuperclass();
Dostęp do nazwy:
String s = c.getName();
Dostęp do implementowanych interfejsów:
Class[] interfaces = c.getInterfaces();
Dostęp do atrybutów:
Field[] fields = c.getFields();
Dostęp do metod:
Method[] methods = c.getMethods();
6 7
JTP Dr Piotr Kosiuczenko JTP Dr Piotr Kosiuczenko
1
Pakiet java.lang.reflect
Drukowanie Nadklas i Interfejsów
public static void printType(Object o) {
Interfejs java.lang.reflect.Member pozwala na
Class c = o.getClass();
if(c.isInterface()) uzyskanie informacji o pojedynczych atrybutach,
System.out.println(" interface " + c.getName());
metodach i konstruktorach.
else
System.out.println(" class " + c.getName());
Klasa java.lang.reflect.Method implementuje
Class superClass = c.getSuperclass();
interfejs Member i daje informacje o poszczególnych
if(superClass != null)
System.out.println("extends " + superClass.getName()); metodach.
Class[] interfaces = c.getInterfaces();
Klasa Field implementuje interfejs Member i daje
for(int i = 0; i < interfaces.length; ++i) {
System.out.println("implements " + interfaces[i].getName());
dynamiczny dostęp do informacji o atrybutach, ich
}
dostępności itp.
}
Podobnymi klasami są Constructor i Package.
8 9
JTP Dr Piotr Kosiuczenko JTP Dr Piotr Kosiuczenko
Adnotacje
Adnotacje (ang. adnotation) dostarczają informacji o programie,
która nie jest jego częścią w ścisłym sensie.
Nie mają bezpośredniego wpływu na wykonanie programu, w
JTP: Adnotacje
którym się znajdują.
Dostarczają dodatkowej informacji dla kompilatora, żeby
wyłuskać błędy lub zdusić komunikaty o błędach.
Niektóre adnotacje mogą być używane również podczas
wykonania programu.
Dr. Piotr Kosiuczenko
10 11
JTP
JTP Dr Piotr Kosiuczenko
Adnotacje Adnotacje
Adnotacje mogą być zastosowane do deklaracji: @transient wskazuje, że atrybut powinien być zignorowany
przy serializacji obiektu.
klas i interfejsów,
@deprecated wskazuje, ze metoda nie powinna już być
atrybutów i metod,
używana.
parametrów formalnych i zmiennych lokalnych.
Najbardziej znane jako komentarze javadoc.
Zobacz:
http://java.sun.com/j2se/javadoc/writingdoccomments/index.ht
ml#format
12 13
JTP Dr Piotr Kosiuczenko JTP Dr Piotr Kosiuczenko
2
JavaDoc: Dokumentacja Metody Deklaracja Typu Adnotacyjnego
ogólny komentarz
/** * Returns an Image object.
@interface jest słowem kluczowym wskazującym na
* The url argument must specify an absolute {@link URL}.
definicję adnotacji.
* @param url - an absolute URL giving the base location of the image
import java.lang.annotation.*;
* @param name the location of the image, relative to the url argument
klauzula
* @return the image at the specified URL
importowania
* @throws IOException
public @interface ClassPreamble {
*/
Każda metoda
String author();
public Image getImage(URL url, String name) { deklaruje element
String date();
adnotacji.
...
int currentRevision() default 1;
}
specyfikacja
String lastModified() default "N/A";
specyfikacja
zwracanej wartości
rzucanych wyjątków
String lastModifiedBy() default "N/A";
String[] reviewers();
specyfikacja
}
parametru deklaracja wartości
typem może
domyślnej
być macierz
14 15
JTP Dr Piotr Kosiuczenko JTP Dr Piotr Kosiuczenko
Adnotacje Konkretna Adnotacja
Można deklarować własne typy adnotacyjne. Konkretna adnotacja klasy wygląda następująco:
Taka deklaracja odpowiada deklaracji interfejsu
@ClassPreamble ( atrybuty z
Metody musza zwracać: konkretnymi
author = "Piotr",
wartościami
prymitywne typy danych (np. int), lub
date = "11.10.2008",
String lub Class, Atrybuty mogą być
//currentRevision = 0,
pominięte, jeśli jest
lastModified = "11.10.08",
enumeracje lub tablice zawierająca wspomniane typy.
zdefiniowana wartość
lastModifiedBy = "Piotr",
Metody nie mogą mieć parametrów albo klauzul throws.
domyślna.
reviewers = {"Piotr", "Robert"}
Jest możliwość zadeklarowania wartości domyślnych.
)
public class MyClass {
//. . .
inicjalizacja macierzy
}
Uwaga na nawiasy!
16 17
JTP Dr Piotr Kosiuczenko JTP Dr Piotr Kosiuczenko
Adnotacje: Literatura
java.sun.com/j2se/1.5.0/docs/guide/language/annotations.html
24
JTP Dr Piotr Kosiuczenko
3


Wyszukiwarka

Podobne podstrony:
Wykład 05 Opadanie i fluidyzacja
Prezentacja MG 05 2012
2011 05 P
05 2
ei 05 08 s029
ei 05 s052
05 RU 486 pigulka aborcyjna
473 05

więcej podobnych podstron