2013-08-09 15 views
6

O ile wiem i rozumiem,języków statycznych i Reflection

Odbicie jest zdolność do tworzenia/modyfikowania kodu źródłowego w czasie wykonywania.

Z Wikipedii:

  • Odkrywanie i modyfikować kod źródłowy (konstrukcje, takie jak bloki kodu, klas, metod, protokołów, etc.) jako obiekt pierwszej klasy w wykonywania.
  • Konwertuj ciąg znaków pasujący do nazwy symbolicznej klasy lub funkcji na odwołanie lub wywołanie tej klasy lub funkcji.
  • Oceń ciąg znaków, tak jakby był instrukcją kodu źródłowego w czasie wykonywania.
    Utwórz nowy interpreter dla kodu bajtowego języka, aby nadać nowy sens lub cel konstruowaniu programistycznego.

Języki dynamiczne są językami, które możemy ocenić (ocenić bezpośrednio z łańcucha) w czasie wykonywania.

z Wikipedii: „przedłużenie programu, poprzez dodanie nowego kodu, poprzez rozszerzenie obiektów i definicje, lub modyfikując system typu”

Ok, teraz moje pytanie brzmi: Jak statyczny język ד (bez zdolność eval) może mieć odbicie (np. Java)? (nowy kod źródłowy nie ocenia?: /)

Z góry dziękuję!

+0

Java ma bibliotekę manipulacji kodu bajtowego o nazwie [ASM] (http://asm.ow2.org/).Odbicie nie służy do dodawania nowego kodu, tak jak opisujesz w swoim pytaniu. –

+1

Odbicie pozwala na manipulowanie (tak, może być szkodliwe w niektórych przypadkach) z klasą poprzez zapytanie o jej metody, pola, poziomy dostępu i takie, ale nie generujesz nowego kodu. Ma inne zastosowania, jak na przykład wywoływanie metody zdefiniowanej w określonej klasie w oparciu tylko o dane na jej temat (* metadane *). Dostajesz instancję z klasy, otrzymujesz od niej metodę opartą na jej firmie, a następnie ją wywołujesz. – Gamb

+0

@Gamb 10x, ale jeśli modyfikujesz kod źródłowy, więc generujesz kod źródłowy (jak mówi wikipedia), nieprawdaż? – gran33

Odpowiedz

4

Myślę, że wyjaśnienie wikipedii nie jest dobrze sformułowane.

Odbicie (lub introspekcja) nie polega na tworzeniu kodu w czasie wykonywania, ale raczej na zdolności kodu do odzwierciedlają się na samym sobie w środowisku wykonawczym (i zmieniają jego zachowanie w oparciu o to). Przykładem może być uzyskanie informacji o typie obiektu (np. RTTI w C++) lub uzyskanie metadanych związanych z obiektem (jak adnotacje w Javie).

Generowanie kodu runtime jest bardziej związane z pierwszej klasy niż z odbiciem, więc twierdzę, że obecny artykuł wikipedia jest w pewnym sensie wprowadzający w błąd.

UPDATE

Innymi słowy odpowiedź na to:

Ok, teraz moje pytanie brzmi, w jaki sposób język statyczne (bez możliwości eval) może mieć odbicie (np Java)?

... byłoby to odbicie, które nie opiera się na zdolności evel. Są to 2 osobne funkcje językowe.

A także, jak zauważył Giulio Franco w komentarzach - Java jest zdolna do generowania kodu wykonawczego \ manipulacji (patrz np. CGLIB).

+1

Chciałbym dodać, że klasy Java są ładowane w czasie wykonywania, a istnieje klasa Java, która pozwala na kompilację i ładowanie klasy Java w locie. Tak naprawdę, Java ** może ** dodać kod w czasie wykonywania. Być może możesz również usunąć, zmodyfikować i załadować klasę, ale myślę, że ma to pewne ograniczenia (może nie możesz zwolnić aktualnie używanej klasy). –