PowerPoint - 13.Reflectionssw.jku.at/Teaching/Lectures/PSW2/2005/Slides/13.Reflection.pdf ·...
Transcript of PowerPoint - 13.Reflectionssw.jku.at/Teaching/Lectures/PSW2/2005/Slides/13.Reflection.pdf ·...
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 1�������������� ��������������
��������������������� ������
Reflection
� Laufzeittypinformationen
� Objekterzeugung und Methodenaufrufe über Reflection
� Dynamic Proxy
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 2�������������� ��������������
��������������������� ������
Reflection
� Programmatischer Zugriff auf Typinformationen• Über Klassen, Konstruktoren, Methoden und Felder
• Zur Laufzeit
• Zugriff erfolgt auf Basis des Byte-Codes
• man kann auf alle Deklarationen zugreifen, nicht aber auf den ausführbaren Code
� Mechanismus• Untersuchen von Objekten
• Erzeugen neuer Instanzen
• Aufruf von Methoden
• Lesen und Schreiben von Feldern
� Paket ��������������
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 3�������������� ��������������
��������������������� ������
Reflection Klassenhierarchie
Member
AccessibleObject Array
java.lang.Object
java.lang.Class
MethodFieldConstructor
Modifier Proxy
InvocationHandler
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 4�������������� ��������������
��������������������� ������
Informationen über ein Objekt
��� ��������
�
������������� ������������ ������������� ���� �����
��� �!�����
�
�������������
��� �"#�����
�
�����
��� ���� �� ������
�
������������� ������������� ������������
�$%� ����
��� ���� �
�
����� ����������� ������������� ��%����� ��& �����
����� �� ���� ����������� �� ����
������� �������������
��!��� ��������!���
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 5�������������� ��������������
��������������������� ������
Anwendungen
� Klasse• Informationen über Paket, Superklasse, innere Klassen und Interfaces
• Auflistung der Felder, Konstruktoren und Methoden
• Erzeugen eines Objekts mit parameterlosem Konstruktor
• Dynamischer Typtest
� Feld• Informationen über Sichtbarkeit und Typ
• Lesen und Schreiben des Feldes für spezifiziertes Objekt
��� ��� '��������� ()*++����
��� ���,��(-!��-)++����
!������ ++����
%������.��
��� ��� '����*!�����'��� ���!���(-���-)*#�����#�����#�����#����� ����'����/�����(�#�)*
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 6�������������� ��������������
��������������������� ������
Anwendungen
� Konstruktor• Typen der Parameter und Ausnahmen
• Erzeugen einer neuen Instanz
� Methode• Parametertypen, Ergebnistyp, Ausnahmetypen
• Informationen über Modifizierer
• Aufruf auf spezifiziertem Objekt wenn erlaubt
��� �� �������'����*"#���01���� '����*!�� �#� '�(!��)����$%� ����(��� )*
��������'����*"#���01���� '����*������2(�#�3���� )*
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 7�������������� ��������������
��������������������� ������
Beispiel: Ausgabe der Klassendefinition (1)
� Es werden alle Deklarationen (Klasse, Felder, Konstruktoren, Methoden, innere Klassen) ausgegeben
� Ausgabe der Package-Deklaration
� Ausgabe Class- oder Interface-Deklaration
� #���� #���� #���� #��� ����� ����� ����� ����� ���������������� �������� (��� ���44)��
++����2������ (���44�������������� ���44�������������� ���44�������������� ���44�������������� ()()()() ''�� ��� ��� ��� ��)���++�������2�� �� ��������
&� ���� ���������(-���2�� -�5����44������2��()���,�����44������2��()���,�����44������2��()���,�����44������2��()���,��()()()() 5�-*-)*�
������������ ������ '����44��������� ���44��������� ���44��������� ���44��������� ()()()()*����� (6����44�� %��������44�� %��������44�� %��������44�� %�����()()()())��
&� ���� ���������(���������&�����(���������������&�����(���������������&�����(���������������&�����(������)))) 5�-���� -�5����44���,��()�5�-����� -�5����44���& ����� ()���,�����44���& ����� ()���,�����44���& ����� ()���,�����44���& ����� ()���,��()()()())*�
��� � � � �&� ���� ���������(���������&�����(���������������&�����(���������������&�����(���������������&�����(������)))) 5�-������� -�5�
���44���,�����44���,�����44���,�����44���,��()()()())*��
������� ������ �
�� �� � ��� ������ ���������� ������� ������ ���������������� ����
// Beispielausgabe für java.util.LinkedList
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 8�������������� ��������������
��������������������� ������
Beispiel: Ausgabe der Klassendefinition (2)
� Ausgabe der implementierten oder erweiterten Interfaces
&�����/ � ��� '��$�$�$�$ &�����/ �()*��� 01������� '����44���%����� ���44���%����� ���44���%����� ���44���%����� ()()()()*���� (������ ������ 6'�7)��
&�����/ � ��� '��$ &�����/ �()*�� (6����44�� %��������44�� %��������44�� %��������44�� %�����()()()())��
���������(-����������� -)*���� � � � �
���������(-�������� -)*���������� (������������ ��'�7*���8������� ������*��55)��
���������(������ 0�1���,�������� 0�1���,�������� 0�1���,�������� 0�1���,��()()()())*����� (��8������� ������9:)��
���������(-3�-)*����� � � � �
���������(-��-)*��
�&� ���� ���������(���)*�
� ��� ������ ������ ���������� ���� ����� �������������� ���� � �
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 9�������������� ��������������
��������������������� ������
Beispiel: Ausgabe der Klassendefinition (3)
� Ausgabe der statischen Felder
� und nicht-statischen Felder
!���01���� '����44���������!��� ���44���������!��� ���44���������!��� ���44���������!��� ()()()()*�������� (��'�7*���8���� ������*��55)��
���� (�������� &�����(��� 0�1��������� �������� &�����(��� 0�1��������� �������� &�����(��� 0�1��������� �������� &�����(��� 0�1��������� ())())())()))�������!���(��� 0�1)*�
�� �������������� ��� � ��� ����� !������"#$�
������������������������ ����� ����� ����� ����� ���������������� �����!���(!��� ���)��&� ���� ���������(-��-�5����������&�����(������������ ���������&�����(������������ ���������&�����(������������ ���������&�����(������������ ())())())()) 5�
-�-�5����������()���,�����������()���,�����������()���,�����������()���,��()()()() 5�-�-�5�������,��������,��������,��������,��()()()() 5�-*-)*��
�������� (��'�7*���8���� ������*��55)������ (6��������� &�����(��� 0�1��������� �������� &�����(��� 0�1��������� �������� &�����(��� 0�1��������� �������� &�����(��� 0�1��������� ())())())()))��
�����!���(��� 0�1)*��
� ����������������� ������ ����������%&���' (����������������������� ��� �����
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 10�������������� ��������������
��������������������� ������
Beispiel: Ausgabe der Klassendefinition (4)
� Ausgabe der Konstruktoren
��� �� ����01���� �� ���� �'����44������������ �� ���� ���44������������ �� ���� ���44������������ �� ���� ���44������������ �� ���� ()*()*()*()*�������� (��'�7*���8���� �� ���� ������*��55)��
�������� �� ����(��� �� ���� 0�1)*�� �� �� ������ ����������)*�
�� �� ������ ����������)������ �� ������*������������������������� ����� ����� ����� ����� ���������������� �������� �� ����(��� �� ���� �)��
&� ���� ���������(-��-�5����������&�����(���������� ���������&�����(���������� ���������&�����(���������� ���������&�����(���������� ())())())()) 5�-�-�5����,��()5���� �� ������� ;� �(�������������� �������������� �������������� �������������� ()()()())�5�-*-)*�
�
������� ����� &��������� �� ������� ;� �(��� ��� ��� ��� 01�01�01�01��������� �������� �������� �������� )��&�����/ � ����� &����� '��$ &�����/ �()*������ &�����������(-(-)*��������� (������������ ��'�7*���8������ ������*��55)��
����� &�����������(�������� 0�1���,���������� 0�1���,���������� 0�1���,���������� 0�1���,��()()()())*����� (��8������ ������9:)��
����� &�����������(-3�-)*��
������ &�����������(-)-)*��� ���� ���� ���� �� ����� &��������&�����()*�
�
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 11�������������� ��������������
��������������������� ������
Beispiel: Ausgabe der Klassendefinition (5)
� Ausgabe der Methoden
� Ausgabe der inneren Klassen
�����01������ '����44�������������� ���44�������������� ���44�������������� ���44�������������� ()*()*()*()*�������� (��'�7*���8������ ������*��55)��
�����(����� 0�1)*�� �� �� ���� ���+����� � ���)*�
�� �� ��� �����+ )���� ���+�����*��� �� ��� ���#����+ )���� ���+�����*�,
������������������������ ����� ����� ����� ����� ���������������� �����(����� �����)��&� ���� ���������(-��-�5����������&�����(�������������� ���������&�����(�������������� ���������&�����(�������������� ���������&�����(�������������� ())())())())5-�-�5��
���������� �����()���,������������ �����()���,������������ �����()���,������������ �����()���,��()()()() 5��-�-�5���������,����������,����������,����������,��()()()() 5���� �� ������� ;� �(������������������ ������������������ ������������������ ������������������ ()()()())�5�-*-)*�
�
��� 01�������� '����44������������ ���44������������ ���44������������ ���44������������ ()()()()*��������� (��'�7*���8�������� ������*��55)��
�������� (������� 0�1)*�&� ���� ���������()*
�
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 12�������������� ��������������
��������������������� ������
Beispiel: Methodenaufrufe über Reflection (1)
� Folgende Anweisungen ohne Verwendung von Reflection
werden im Anschluss über Reflection ausgeführt
;� ���*���'��$�$�$�$ ;��2�;� �()*�����(-<-)*�����(-�-)*�����(:3�-/-)*�
&� ���� ���������(����&�����())*�
���� (��������� (-<-))��&� ���� ���������(-< �������� ����-)*�
�
[A, B, C]
A contained in l
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 13�������������� ��������������
��������������������� ������
Beispiel: Methodenaufrufe über Reflection (2)
� Zugriff auf Klasse ;��2�;� � und erzeugen des Objekts
� Zugriff auf Methode ���("#���) und Aufrufe
� Zugriff auf Methode ���(���3�"#���) und Aufruf
������������ �;� ���*�
++ ��'��$ ;��2�;� �()*��� ���2�;� ���� '���� ���,��(-����� ����;��2�;� �-)*���'�(;� �)���2�;� ���� ��$%� ����()*�
++ �����(-<-)*����� �������� '�
���2�;� ���� ��������(-���-3��$ ��� 01���"#������� ��� ��� ��� �)*��������������2(�3��$�$�$�$ "#���01���-<-��)*�
++ �����(-�-)*�������������2(�3��$�$�$�$ "#���01���-�-��)*�
++ �����(:3�-/-)*������ ��������=�'����2�;� ���� ��������(-���-3�
�$�$�$�$ ��� 01���%������.��3�"#������� ��� ��� ��� �)*���������=�����2(�3��$�$�$�$ "#���01����$�$�$�$ %����(:)3�-/-��)*�
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 14�������������� ��������������
��������������������� ������
Beispiel: Methodenaufrufe über Reflection (3)
� Aufruf von ��&�����()
� Aufruf von ������� ("#���)
++ &� ���� ���������(����&�����())*������ ��&���������� '�
���2�;� ���� ��������(-��&�����-3��$�$�$�$ ��� 071)*�&� ���� ���������(��&���������������2(�3��$�$�$�$ "#���071))*�
++ � (��������� (-<-))��++ &� ���� ���������(-< �������� ����-)*�++ �
����� ������� ����� '����2�;� ���� ��������(-������� -3��$�$�$�$ ��� 01���"#������� ��� ��� ��� ��)*
/����� ����� '�(/�����)������� ����������2(�3��$�$�$�$ "#���01��-<-�)*����� (������#�����>�� ())��
&� ���� ���������(-< �������� ����-)*�
���������������������� (,�& ��������������� )��?���������������������� (%�����<�� ����������� )���?���������������������� (%�����<�� �������� )��?���������������������� (%���������������������� )��?���������������������� (��� ,��!� ���������� )��?���������������������� (%� ������������������ )��?���������������������� (&� ������������ )��?�
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 15�������������� ��������������
��������������������� ������
Vordefinierte Typen
� Für die primitiven Datentypen sind ��� -Objekte als Konstante definiert @ /����.�� - Typ #��
@ &������.�� - Typ ����
@ %������.�� - Typ ���
@ ;�����.�� - Typ ����
@ ����������.�� - Typ ����
@ /�������.�� - Typ #�����
@ !������.�� - Typ ����
@ �� #���.�� - Typ �� #�
@ >�����.�� - Typ ����
� Anwendung z.B.
���� (���������� �����())�''�%������.��)�������������� �� '�((%����)����������2(�#�3��$�$�$�$ "#���071)))����>�� ()*�
�
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 16�������������� ��������������
��������������������� ������
Dynamic Proxy
� Platzhalterobjekt• Implementiert zur Laufzeit spezifizierte Liste von Interfaces
• Methodenaufrufe werden an Invocation Handler weitergeleitet
� #���� #���� #���� #��� ��� ��� ��� ��� ;������������ ������� ������� ������� %���������A����� ������������������������� �����&���� ���*
� #���� #���� #���� #��� ;����(�����&���� ���)����� ��� ��� ��� ���� '����*
�
� #���� #���� #���� #��� "#��������2("#��� �����3������������3�"#���01���� )�����$ ����$ ����$ ����$ ����$�#� �
����
�
;���� ������'��$�$�$�$ ;����(&� ���� �)*!�� ������'�(!��)��������$�����%� ����(!������ ������ ;����()3��$�$�$�$ ��� 01���!������ �3������)*
������ �������(BBB)*
� #���� #���� #���� #��� ������������������������ !�� �� #���� #���� #���� #��� ���������������� �������(������������ �)*
�
Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 17�������������� ��������������
��������������������� ������
Zusammenfassung
� Reflection• Programmatischer Zugriff auf Typinformationen zur Laufzeit
• Erzeugen neuer Instanzen, Aufruf von Methoden, Zugriff auf Felder
� Dynamic Proxy• Platzhalterobjekt, das Liste von Interfaces implementiert