Mechanizm refleksji udostępnia w klasie Class metody: getDeclaringClass oraz getEnclosingClass. Jaka jest różnica w ich działaniu?
Mechanizm refleksji udostępnia w klasie Class metody: getDeclaringClass oraz getEnclosingClass. Jaka jest różnica w ich działaniu?
Metoda getDeclaringClass zwraca obiekt Class reprezentujący klasę w której bieżąca klasa jest zdefiniowana.
Metoda getEnclosingClass zwraca obiekt Class reprezentujący bezpośrednią klasę zewnętrzną dla bieżącej klasy.
Rzeczywiście w wielu przypadkach wyniki obu metod będą identyczne. Różnica uwidoczni się w przypadku użycia klasy wewnętrznej i klasy anonimowej. Wyjaśnia to poniższy przykład:
package pl.altkom; public class A { // klasa wewnętrzna public class B { public void test() { Class<? extends A.B> c = getClass(); System.out.println("test() from B class"); System.out.println("\tdeclaring class: "+ c.getDeclaringClass()); System.out.println("\tenclosing class: " + c.getEnclosingClass()); } } public static void main(String[] args) { A a = new A(); B b = a.new B(); b.test(); // klasa anonimowa new A() { public void test() { Class<? extends A> c = getClass(); System.out.println("\ntest() from anonymous class"); System.out.println("\tdeclaring class: "+ c.getDeclaringClass()); System.out.println("\tenclosing class: " + c.getEnclosingClass()); } }.test(); } }
Wynik działania programu przedstawia się następująco:
test() from B class declaring class: class pl.altkom.A enclosing class: class pl.altkom.A test() from anonymous class declaring class: null enclosing class: class pl.altkom.A
W obu przypadkach klasą zewnętrzną jest klasa A, ale tylko w przypadku klasy anonimowej nie ma sensu pojęcie klasy deklarującej.