Czasami zdarza się, że jesteśmy świadomi istnienia jakiejś funkcjonalności, jednak wredny twórca biblioteki bezwstydnie ją przed nami ukrył. A my ją odkryliśmy na przykład przy pomocy Reflectora.
Zasymulujmy taką sytuację. Wyobraźmy sobie bibliotekę z klasą Jarek oznaczoną jako internal. Klasa Jarek z kolei chowa przed nami bardzo ciekawą funkcjonalność - zakładanie konta w banku za pośrednictwem nieistotnej dla nas klasy Bank:

 1:   namespace JarekLibrary
2: {
3: internal class Jarek
4: {
5: private void CreateBankAccount()
6: {
7: Console.WriteLine("<płacze_i_krzyczy>");
8: Bank.CreateAccount(this);
9: Console.WriteLine("<lecz_zalozyl>");
10: }
11: }
12: }

My, podli użytkownicy, bardzo chcemy zmusić Jarka do założenia konta. Umożliwia nam to mechanizm refleksji. Poniższy kod pozostawiam bez komentarza - jest to działająca metoda a po szczegóły odsyłam MSDN, żeby bezsensownie nie przepisywać tutaj dokumentacji:

 1:   static void Main(string[] args)
2: {
3: Assembly jarekLibrary = Assembly.LoadFrom("JarekLibrary.dll");
4: Type jarekType = jarekLibrary.GetType("JarekLibrary.Jarek");
5: object jarekInstance = Activator.CreateInstance(jarekType);
6: MethodInfo createAccountMethod = jarekType.GetMethod("CreateBankAccount", BindingFlags.NonPublic | BindingFlags.Instance);
7: createAccountMethod.Invoke(jarekInstance, null);
8: }

W efekcie zobaczymy na konsoli słodki tekst informujący o sukcesie.


P.S. Wszekie skojarzenia z faktycznym stanem rzeczywistości oczywiście niezamierzone - równie dobrze można było nazwać klasę Bonifacy, ale nie wyglądałoby to tak ślicznie.


Komentarze

Jacek Ciereszko

26 marca 2008 18:53

Wiedziałem że introspekcja ma duże możliwości ale że aż takie, to nie. nice :D

Choć ja ze swojej strony radzę uważać, jak Jarek podeśle nowszą wersje .dll i zmieni coś z klasą "Jarek" lub metodą "CreateBankAccount()", to nasz kod może się wyłożyć, pomimo tego że będzie się kompilował.

Procent

26 marca 2008 20:16

Mało tego, kompiluje się nawet gdy biblioteka nie zawiera klasy "Jarek". Dlatego też stosując ten mechanizm trzeba sobie zdawać sprawę z ryzyka jakie on ze sobą niesie.

dotnetomaniak.pl

10 listopada 2009 06:56

Trackback from dotnetomaniak.pl

Łamiemy prywatność, czyli załóżmy Jarkowi konto!

andrzej

10 listopada 2009 20:15

refleksje dość znane - w każdej niemal literaturze wspominają o tym, że dla refleksji nie ma świętości. fajny przykład. śmiałem się kilka minut z ideii Jarka :D brawo za pomysł ;) !

Komentarze zamknięte