Mechanizmy refleksji w Javie i C# Autor: Aleksander Nałęczyński



Podobne dokumenty
Kompozycja i dziedziczenie klas

Język JAVA podstawy. wykład 1, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Programowanie obiektowe

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017

Na przykładzie języków Java, C# i odrobiny C++ Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Programowanie obiektowe

Na przykładzie języków Java, C# i odrobiny C++ Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Programowane refleksyjne i serializacja

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.

JĘZYK UML JAKO NARZĘDZIE MODELOWANIA PROCESU PROJEKTOWO-KONSTRUKCYJNEGO

0.1 Hierarchia klas Diagram Krótkie wyjaśnienie

Spis treści INTERFEJS (WEBSERVICES) - DOKUMENTACJA TECHICZNA 1

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Enkapsulacja, dziedziczenie, polimorfizm

Projektowanie i programowanie obiektowe (materiały do wykładu cz. VI)

InsERT GT Własne COM 1.0

Programowanie obiektowe

Programowanie obiektowe

Aplikacje w środowisku Java

Programowanie obiektowe

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

1 Atrybuty i metody klasowe

Wykład 7: Pakiety i Interfejsy

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

WYMAGANIA EDUKACYJNE I KRYTERIA OCENIANIA Z PRZEDMIOTU PROGRAMOWANIE APLIKACJI INTERNETOWYCH

Dziedziczenie : Dziedziczenie to nic innego jak definiowanie nowych klas w oparciu o już istniejące.

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Programowanie obiektowe

Podejście obiektowe do budowy systemów rozproszonych

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Remote Method Invocation 17 listopada 2010

Praca na wielu bazach danych część 2. (Wersja 8.1)

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

Remote Method Invocation 17 listopada Dariusz Wawrzyniak (IIPP) 1

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Podejście obiektowe do budowy systemów rozproszonych

Uniwersytet Rzeszowski

Co jeszcze mogą nam dać adnotacje? Adam Warski

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

WSNHiD, Programowanie 2, Lab. 3. Trwałość danych

Automatyzacja procesu publikowania w bibliotece cyfrowej

Programowanie obiektowe

Programowanie obiektowe Wykład 1. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/20

Od wymagań do Javy w mgnieniu oka

Języki i paradygmaty programowania Wykład 2. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/18

Remote Method Invocation 17 listopada rozproszonych. Dariusz Wawrzyniak (IIPP) 1

Wartości domyślne, szablony funkcji i klas

Programowanie obiektowe

Wywoływanie metod zdalnych

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

Języki i metody programowania Java INF302W Wykład 2 (część 1)

Programowanie obiektowe

Aplikacje w środowisku Java

Tworzenie aplikacji internetowych E14

Przykład -

Programowanie w Internecie. Java

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Platformy Programistyczne Podstawy języka Java

PROGRAMOWANIE OBIEKTOWE W C++ - cz 1. Definicja klasy, składniki klasy, prawa dost pu, definiowanie funkcji składowych, konstruktory i destruktory.

Technologie i usługi internetowe cz. 2

Języki i metody programowania Java. Wykład 2 (część 2)

Budowa prostej aplikacji wielowarstwowej. Laboratorium 1 Programowanie komponentowe Zofia Kruczkiewicz

Materiały oryginalne: ZAWWW-2st1.2-l11.tresc-1.0kolor.pdf. Materiały poprawione

Programowanie obiektowe w języku


Polimorfizm, metody wirtualne i klasy abstrakcyjne

Java niezbędnik programisty spotkanie nr 3. Modyfikatory, jednostki kompilacji, tworzenie/inicjalizacja, odśmiecanie/ finalizacja...

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Dokumentacja do API Javy.

Podstawy Języka Java

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

Java język programowania zorientowany obiektowo

Programowanie w Javie - wykład 3

Instrukcja laboratoryjna cz.3

Początki Javy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 8

Aplikacje RMI Lab4

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13

Dziedziczenie. dr Jarosław Skaruz

Akademia ETI. Wprowadzenie do programowania w Javie PG Java User Group Przemysław Kulesza

Procedura nadawania uprawnień do potwierdzania Profili Zaufanych w Urzędzie Gminy w Ryjewie

Środowisko programisty

Podstawy programowania obiektowego

Ćwiczenie 1. Przygotowanie środowiska JAVA

BEAN VALIDATION. Waldemar Korłub. Narzędzia i aplikacje Java EE KASK ETI Politechnika Gdańska

Programowanie w języku Java WYKŁAD

Java. Programowanie Obiektowe Mateusz Cicheński

Programowanie 2. Język C++. Wykład 2.

Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.

Programowanie poprzez testy z wykorzystaniem JUnit

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Analiza systemowa. Andrzej Łachwa Bazy danych 12+/15

PROGRAMOWANIE DYNAMICZNE

Java: interfejsy i klasy wewnętrzne

Zaawansowane aplikacje internetowe - laboratorium Architektura Spring.

Klasy abstrakcyjne, interfejsy i polimorfizm

Transkrypt:

Mechanizmy refleksji w Javie i C# Autor: Aleksander Nałęczyński

Co to jest refleksja? [1/2] Możliwość obserwowania lub manipulowania pracą programu od wewnątrz Problem Zazwyczaj niskopoziomowa struktura programu różni się od wysokopoziomowej

Co to jest refleksja? [2/2] System refleksyjny (reflective system) System zawierający struktury reprezentujące aspekty samego siebie System ma zawsze dokładną reprezentację samego siebie Reprezentacja zawsze zgadza sie z aktualnym stanem systemu

Motywacja Tworzenie statystyk działania programu Debuggowanie Skrypty użytkownika Komunikacja z innymi systemami Systemy samokonfigurujące

Historia Programy modyfikujące własny kod Forth Lisp (Scheme, CLOS) Prolog

Architektury refleksyjne meta-circular interpreter 3-LISP 3-KRS FOL TEIRESIAS

Scheme Kontynuacje Refleksja proceduralna (procedural reflection) Reprezentacja systemu w terminach programu implementującego system (eval (+ 1 2))

Smalltalk Refleksja dobrze wpasowuje się w paradygmat obiektowy W pełni refleksyjny system Dynamiczny system typów Możliwość dodawania nowych klas w trakcie działania Smalltalk-80 Metaklasy

3-KRS Każdy obiekt jest związany z metaobiektem Pełna, modyfikowalna samoreprezentacja programu

Protokoły metaobiektowe (MOP) Reprezentujemy instancje klas, metody i komunikaty jako dane Przechwytujemy komunikaty między obiektami, przekazujemy je do metaobiektu Kontynuujemy normalne wykonanie

Modele refleksji Metaklasy Metaobiekty Metaklasa MClass Klasa metaobiektu MOClass instance-of instance-of Metaobiekt Klasa ClassA Klasa instance-of Obiekt ClassB instance-of Obiekt

Java i C# Introspekcja, ale nie modyfikacja struktur Tworzenie instancji klasy Dynamiczne wołanie metod Zmiana wartości pól

java.lang.reflect vs System.Reflection Assembly java.lang.class Field Method Constructor<T> System.Type FieldInfo MethodInfo PropertyInfo ConstructorInfo

Dynamiczne ładowanie klas Java Class c = Class.forName("MojaKlasa"); C# Assembly a = Assembly.Load("assembly.dll"); Type t = a.gettype("mojaklasa");

Opóźnione wiązanie Java Object o = c.newinstance(); // wywołanie metody bezparametrowej Method m = c.getmethod("tostring", null); String s = m.invoke(o, null); C# Type themathtype = Type.GetType("System.Math"); Object theobj = Activator.CreateInstance(theMathType); Type[] paramtypes = new Type[1]; paramtypes[0]= Type.GetType("System.Double"); MethodInfo CosineInfo = themathtype.getmethod("cos",paramtypes); Object[] parameters = new Object[1]; parameters[0] = 45; Object returnval = CosineInfo.Invoke(theObj,parameters);

C#: atrybuty [1/5] Wbudowane (intrinsic attributes) using System.Security.Permissions; [assembly: FileIOPermission(SecurityAction.RequestMinimum) ] public class FileManager {...}

C#: atrybuty [2/5] Użytkownika (custom attributes) public class BugFixAttribute: System.Attribute { // przynajmniej 1 konstruktor musi być zdefiniowany // Tutaj są ustawiane wartości parametrów pozycyjnych public BugFixAttribute(int bugid, string programmer, string date) { } this.bugid = bugid; this.programmer = programmer; this.date = date;

C#: atrybuty [3/5] // parametry nazwane są implementowane jako właściwości public string Comment { get { return comment; } set { comment = value; } } } // BugFixAttribute

C#: atrybuty [4/5] Sposób użycia /* Określenie wartości parametrów pozycyjnych jest obowiązkowe, opcjonalne dla parametrów nazwanych */ [BugFixAttribute(121,"Jesse Liberty","01/03/05")] [BugFixAttribute(107,"Jesse Liberty","01/04/05", Comment="Fixed off by one errors")] public class MyMath {...}

C#: atrybuty [5/5] Meta-atrybuty [AttributeUsage(AttributeTargets.Class AttributeTargets.Constructor AttributeTargets.Field AttributeTargets.Method AttributeTargets.Property, AllowMultiple = true)] public class BugFixAttribute : System.Attribute {...}

Java: adnotacje [1/3] Wbudowane http://java.sun.com/j2se/1.5.0/docs/api/java/lang/annotation/a nnotation.html @Deprecated public class SomeClass {...} @Deprecated public void method() {...} @Override public String tostirng() {...}

Java: adnotacje [2/3] Użytkownika import java.lang.annotation.*; public @interface BugFix { int id(); String name() default "[anonymous]"; String date(); } @BugFix( id = 2868724, name = "G. Kiczales date = "4/1/2007" ) public static void takeyourtime() {...}

Java: adnotacje [3/3] Meta-adnotacje @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Test {...} Deklaracje meta-adnotacji // Adnotacja @Target opisuje również samą siebie @Documented @Retention(value=RUNTIME) @Target(value=ANNOTATION_TYPE) public @interface Target

Java: klasy proxy java.lang.reflect.proxy Motywacja np. stworzenie obiektu implementującego wiele interfejsów dziedziczących po EventListener static Class<?> getproxyclass(classloader loader, Class<?>... interfaces) static Object newproxyinstance(classloader loader, Class<?>[] interfaces, InvocationHandler h) Brak tego mechanizmu w C#

C#: Kompilacja [1/2] Zapisujemy kod C# do pliku Wywołujemy kompilator C# ProcessStartInfo psi = new ProcessStartInfo( ); psi.filename = "cmd.exe"; string compilestring = "/c csc /optimize+ "; compilestring += " /target:library "; compilestring += "{0}.cs > compile.out"; psi.arguments = String.Format(compileString, filename); psi.windowstyle = ProcessWindowStyle.Minimized; Process proc = Process.Start(psi); proc.waitforexit( );

C#: Kompilacja [2/2] Ładujemy powstałą bibliotekę Assembly a = Assembly.LoadFrom(fileName + ".dll"); Object theobject = a.createinstance(classname); Type thetype = a.gettype(classname); Usuwamy plik z kodem File.Delete(fileName + ".cs");

Słabości mechanizmów refleksji w Javie i C# Nie można dodawać metod, ani zmieniać kodu istniejących Nie można dziedziczyć po metaklasach Class Method

Rozszerzenia Javy MetaJava Guarana JMOP

Refleksja a AOP

Bibliografia Gregory T. Sullivan, AOP using Reflection and MetaObject Protocols, CACM 2001 people.csail.mit.edu/u/ g/gregs/public_html/cacm-sidebar.pdf Jesse Liberty, Programming C#, O Reilly 2001 MSDN Library Kirk Radeck, C# and Java: Comparing Programming Languages

Bibliografia http://java.sun.com/j2se/1.5.0/docs/api/java/lang/reflect/packa ge-summary.html http://msdn.microsoft.com/library/default.asp?url=/library/enus/cpref/html/frlrfsystemreflection.asp http://java.sun.com/j2se/1.5.0/docs/guide/language/annotation s.html http://java.sun.com/j2se/1.5.0/docs/guide/reflection/proxy.html