logo

API refleksji Java

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.
Czy wiesz?
  • 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:

metodaOpis
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, IllegalAccessExceptiontworzy 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 SecurityExceptionzwraca całkowitą liczbę pól tej klasy.
9) Metoda publiczna[] getDeclaredMethods() zgłasza wyjątek SecurityExceptionzwraca całkowitą liczbę metod tej klasy.
10) public Constructor[] getDeclaredConstructors() zgłasza wyjątek SecurityExceptionzwraca całkowitą liczbę konstruktorów tej klasy.
11) Metoda publiczna getDeclaredMethod(Nazwa ciągu, Klasa[]parametry) zgłasza wyjątek NoSuchMethodException,SecurityExceptionzwraca 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