Mechanizm refleksji: Różnice pomiędzy wersjami

[wersja nieprzejrzana][wersja przejrzana]
Usunięta treść Dodana treść
m drobne redakcyjne, drobne techniczne
Znacznik: Wycofane
PG (dyskusja | edycje)
Anulowanie wersji 63598152 autorstwa Benedykt Gierosławski (dyskusja) nie należy mnożyć przykładów, Wikipedia nie służy do tego
Znacznik: Anulowanie edycji
Linia 1:
'''Mechanizm refleksji''' – pojęcie z dziedziny informatyki oznaczające proces, dzięki któremu program komputerowy może być modyfikowany w trakcie działania w sposób zależny od własnego kodu oraz od zachowania w trakcie wykonania. [[Paradygmat programowania]] ściśle związany z mechanizmem refleksji to ''programowanie refleksyjne''.
 
Refleksja pozwala w łatwy sposób zarządzać kodem tak, jakby był danymi. Używa się jej najczęściej do zmieniania standardowego zachowania już zdefiniowanych metod lub funkcji, a także do tworzenia własnych konstrukcji semantycznych modyfikujących język. Z drugiej strony kod wykorzystujący '''refleksję''' jest mniej czytelny, i nie pozwala na sprawdzenie poprawności składniowej i semantycznej w trakcie kompilacji (niewygodne śledzenie błędów).
 
Mechanizm ten jest częściej spotykany w [[język wysokiego poziomu|językach wysokiego poziomu]], zwykle opartych na [[maszyna wirtualna|maszynie wirtualnej]] lub wykorzystujących [[Interpreter (program komputerowy)|interpreter]]. W językach, których kod źródłowy jest kompilowany do kodu maszynowego, stosuje się podobny mechanizm znany jako [[RTTI]].
 
== Przykłady ==
 
=== C# ===
Poniższy przykład demonstruje użycie refleksji w języku [[C Sharp]] używając pakietu [http://msdn.microsoft.com/pl-pl/library/system.reflection%28v=vs.110%29.aspx System.Reflection]
 
<syntaxhighlight lang="objc">
//bez refleksji
Linia 20 ⟶ 18:
MethodInfo inf = type.GetMethod("hello");
inf.Invoke(foo); // jako drugi parametr metoda Invoke przyjmuje tablicę Object[] są to parametry metody hello.
 
 
 
 
</syntaxhighlight>
 
=== Delphi / Object PascalObjective-C ===
Poniższy przykład demonstruje użycie RTTIrefleksji w języku [[Embarcadero Delphi|DelphiObjective-C]]/[[Object Pascal]]. W przykładzie zakłożono, że klasa <tt>TFoo</tt> została zadeklarowana w jednostce o nazwie <tt>FooUnit</tt>:
 
<syntaxhighlight lang="Delphiobjc">
// bez refleksji
uses
Foo *foo = [[Foo alloc] init];
RTTI, FooUnit;
[foo hello];
[foo release];
 
// z refleksją
procedure WithoutReflection;
id foo = [[NSClassFromString(@"Foo") alloc] init];
var
SEL selector = NSSelectorFromString(@"hello");
Foo: TFoo;
[foo performSelector:selector];
begin
[foo release];
Foo := TFoo.Create;
try
Foo.Hello;
finally
Foo.Free;
end;
end;
 
procedure WithReflection;
var
RttiContext: TRttiContext;
RttiType: TRttiInstanceType;
Foo: TObject;
begin
RttiType := RttiContext.FindType('FooUnit.TFoo') as TRttiInstanceType;
Foo := RttiType.GetMethod('Create').Invoke(RttiType.MetaclassType, []).AsObject;
try
RttiType.GetMethod('Hello').Invoke(Foo, []);
finally
Foo.Free;
end;
end;
</syntaxhighlight>
 
=== Java ===
Poniższy przykład w [[Java|języku Java]] wykorzystuje pakiet [http://java.sun.com/j2se/1.5.0/docs/api/java/lang/reflect/package-summary.html java.lang.reflect].
Linia 97 ⟶ 78:
}
}
</syntaxhighlight>
 
=== Objective-C ===
Poniższy przykład demonstruje użycie refleksji w języku [[Objective-C]]
 
<syntaxhighlight lang="objc">
// bez refleksji
Foo *foo = [[Foo alloc] init];
[foo hello];
[foo release];
 
// z refleksją
id foo = [[NSClassFromString(@"Foo") alloc] init];
SEL selector = NSSelectorFromString(@"hello");
[foo performSelector:selector];
[foo release];
</syntaxhighlight>