Odbicie Javy jest proces sprawdzania lub modyfikowania zachowania klasy w czasie wykonywania .
The Klasa java.lang.Class class udostępnia wiele metod, których można użyć do uzyskania metadanych, sprawdzenia i zmiany zachowania klasy w czasie wykonywania.
Pakiety java.lang i java.lang.reflect udostępniają klasy do refleksji w języku Java.
Gdzie jest używany
Interfejs API Reflection jest używany głównie w:
- IDE (zintegrowane środowisko programistyczne), np. Eclipse, MyEclipse, NetBeans itp.
- Debuger
- Narzędzia testowe itp.
- Na ile sposobów możemy uzyskać instancję klasy Class?
- Jak stworzyć narzędzie javap?
- Jak stworzyć narzędzie appletviewer?
- Jak uzyskać dostęp do metody prywatnej spoza klasy?
Klasa java.lang.Class
Klasa java.lang.Class realizuje głównie dwa zadania:
- udostępnia metody pobierania metadanych klasy w czasie wykonywania.
- udostępnia metody sprawdzania i zmiany zachowania klasy w czasie wykonywania.
Powszechnie stosowane metody klasy Class:
metoda | Opis |
---|---|
1) publiczny String getName() | zwraca nazwę klasy |
2) publiczna statyczna klasa forName(String className) zgłasza wyjątek ClassNotFoundException | ładuje klasę i zwraca odwołanie do klasy Class. |
3) Obiekt publiczny newInstance() zgłasza wyjątek InstantiationException, IllegalAccessException | tworzy nową instancję. |
4) publiczna wartość logiczna isInterface() | sprawdza, czy jest to interfejs. |
5) publiczna wartość logiczna isArray(); | sprawdza, czy jest to tablica. |
6) publiczna wartość logiczna isPrimitive() | sprawdza, czy jest prymitywny. |
7) Klasa publiczna getSuperclass() | zwraca odwołanie do klasy nadklasy. |
8) public Field[] getDeclaredFields() zgłasza wyjątek SecurityException | zwraca całkowitą liczbę pól tej klasy. |
9) Metoda publiczna[] getDeclaredMethods() zgłasza wyjątek SecurityException | zwraca całkowitą liczbę metod tej klasy. |
10) public Constructor[] getDeclaredConstructors() zgłasza wyjątek SecurityException | zwraca całkowitą liczbę konstruktorów tej klasy. |
11) Metoda publiczna getDeclaredMethod(Nazwa ciągu, Klasa[]parametry) zgłasza wyjątek NoSuchMethodException,SecurityException | zwraca instancję klasy metody. |
Jak zdobyć obiekt klasy Class?
Istnieją 3 sposoby uzyskania instancji klasy Class. Są one następujące:
- forName() klasy Class
- getClass() klasy Object
- składnia .class
1) metoda forName() klasy Class
- służy do dynamicznego ładowania klasy.
- zwraca instancję klasy Class.
- Należy go używać, jeśli znasz pełną nazwę klasy. Nie można jej używać w przypadku typów pierwotnych.
Zobaczmy prosty przykład metody forName().
Nazwa pliku: Test.java
class Simple{} public class Test{ public static void main(String args[]) throws Exception { Class c=Class.forName('Simple'); System.out.println(c.getName()); } }
Wyjście:
Simple
2) metoda getClass() klasy Object
Zwraca instancję klasy Class. Należy go używać, jeśli znasz typ. Co więcej, można go używać z prymitywami.
Nazwa pliku: Test.java
class Simple{} class Test{ void printName(Object obj){ Class c=obj.getClass(); System.out.println(c.getName()); } public static void main(String args[]){ Simple s=new Simple(); Test t=new Test(); t.printName(s); } }
Wyjście:
Simple
3) Składnia .class
Jeśli typ jest dostępny, ale nie ma instancji, możliwe jest uzyskanie klasy poprzez dodanie „.class” do nazwy typu. Można go również używać do prymitywnych typów danych.
Nazwa pliku: Test.java
Instrukcja przełącznika Java
class Test{ public static void main(String args[]){ Class c = boolean.class; System.out.println(c.getName()); Class c2 = Test.class; System.out.println(c2.getName()); } }
Wyjście:
boolean Test
Określanie obiektu klasy
Do określenia obiektu klasy wykorzystywane są następujące metody klasy Class:
1) publiczna wartość logiczna isInterface(): określa, czy określony obiekt klasy reprezentuje typ interfejsu.
2) publiczna wartość logiczna isArray(): określa, czy ten obiekt Class reprezentuje klasę tablicy.
3) publiczna wartość logiczna isPrimitive(): określa, czy określony obiekt klasy reprezentuje typ pierwotny.
Zobaczmy prosty przykład API odbicia w celu określenia typu obiektu.
Nazwa pliku: Test.java
class Simple{} interface My{} class Test{ public static void main(String args[]){ try{ Class c=Class.forName('Simple'); System.out.println(c.isInterface()); Class c2=Class.forName('My'); System.out.println(c2.isInterface()); }catch(Exception e){System.out.println(e);} } }
Wyjście:
false true
Plusy i minusy refleksji
Odbicia Java należy zawsze używać ostrożnie. Chociaż odbicie ma wiele zalet, ma też pewne wady. Omówmy najpierw zalety.
Plusy: Kontrola interfejsów, klas, metod i pól w czasie wykonywania jest możliwa przy użyciu refleksji, nawet bez używania ich nazw w czasie kompilacji. Możliwe jest także wywoływanie metod, tworzenie instancji kasowania lub ustawianie wartości pól za pomocą odbicia. Pomaga w tworzeniu wizualnych środowisk programistycznych i przeglądarek klasowych, co zapewnia pomoc programistom w pisaniu poprawnego kodu.
Cons: Stosując refleksję, można złamać zasady enkapsulacji. Dostęp do prywatnych metod i pól klasy można uzyskać za pomocą refleksji. Zatem refleksja może spowodować wyciek ważnych danych do świata zewnętrznego, co jest niebezpieczne. Na przykład, jeśli ktoś uzyska dostęp do prywatnych członków klasy i ustawi dla nich wartość null, wówczas drugi użytkownik tej samej klasy może uzyskać wyjątek NullReferenceException, a takie zachowanie nie jest oczekiwane.
Kolejną wadą jest narzut na wydajność. Ponieważ typy odzwierciedlane są rozpoznawane dynamicznie, nie można przeprowadzić optymalizacji JVM (Java Virtual Machine). Dlatego operacje wykonywane przez odbicia są zwykle powolne.
Wniosek
Ze względu na wyżej wymienione wady ogólnie zaleca się unikanie stosowania odbicia. Jest to zaawansowana funkcja, z której powinni korzystać wyłącznie programiści lub programiści posiadający dobrą znajomość podstaw języka. Zawsze pamiętaj! Ilekroć używane jest odbicie, bezpieczeństwo aplikacji jest zagrożone.
Następne tematy poradnika Reflection API
metoda newInstance().Zrozumienie narzędzia javap
tworzenie narzędzia javap
tworzenie narzędzia appletviewer
Wywołaj metodę prywatną z innej klasy