Методът getClass(), обектът Class и въведение в Reflection - 1

„Здрасти, Амиго!“

„Сега е време за основното събитие. Ще се запознаем с класа Class и ще се докоснем до Reflection.
Както вероятно вече сте разбрали, всичко в Java е обект. И от Howво се нуждае един обект? Какво има всеки обект, което дефинира за Howво става дума?"

"Клас!"

"Точно! Браво. Всеки обект има клас. Но да се върнем на обектите... Някои обекти изцяло съдържат обект, докато други просто помагат за управлението му."

"Този последен тип включва FileOutputStream и Thread . Когато създавате обект Thread , не се създава нова нишка. Нишката се създава от виртуалната машина на Java след извикването на метода start(). Този обект просто помага за управлението на процеса."

„Същото с FileOutputStream : файлът се съхранява на диска и операционната система управлява съхранението и достъпа. Но ние можем да взаимодействаме с него чрез File обекти, отново с помощта на виртуалната машина на Java.“

— Да, това вече го разбирам.

„И така, има специален клас, наречен Class за взаимодействие с класове.“

— Не беше трудно да отгатна.

"Да. Всеки път, когато виртуалната машина на Java зарежда нов клас в паметта, тя създава обект Class, който можете да използвате, за да получите конкретна информация за заредения клас."

"Всеки клас и обект е свързан с « Обект на клас »."

Пример Описание
Class clazz = Integer.class;
Получава обекта Class на класа Integer.
Class clazz = int.class;
Получава обекта Class на int класа.
Class clazz = "123".getClass();
Получава обекта Class на String обект.
Class clazz = new Object().getClass();
Получава обекта Class на обекта Object.

"Уау! Колко интересно!"

„Спомняте ли си, че думата клас е ключова дума в Java и не може да се използва като име на променлива?“

"О, да, знам, знам. Просто забравих."

„Използвали ли сте вече обекта Class някъде?“

„Да, използвахме го, когато написахме нашата собствена реализация на метода equals.“

„Да, можете да използвате метода getClass(), за да проверите дали обектите имат един и същи клас.“

— И Howво можеш да направиш с този предмет?

"Ами, много неща:"

Java code Описание
Class s = int.class;
String name = s.getName();
Получава името на класа.
Class s = Class.forName("java.lang.String");
Получава клас по име.
Object o1 = String.valueOf(1);
Object o2 = 123 + "T";
o1.getClass() == o2.getClass();
Сравнява класовете на обекти.

„Интересно, но не толкова готино, колкото си мислех.“

„Искате ли да е готино? Има и ReflectionReflection е супер готино.“

„Какво е отражение ?“

" Отражението е способността на класа да получава информация за себе си. Java има специални класове:  Field и Method , които са подобни на класа Class за класове. Точно Howто Class обектите ви позволяват да получите информация за клас, Field обектите предоставят информация за поле , а обектът Method предоставя информация за метод. И вижте Howво можете да правите с тях:"

Java code Описание
Class[] interfaces = List.class.getInterfaces();
Получава списък с обекти Class за интерфейсите на класа List
Class parent = String.class.getSuperclass();
Получава обекта Class на родителския клас на класа String
Method[] methods = List.class.getMethods();
Получава списък с методите на класа List
String s = String.class.newInstance();
Създава нов низ
String s = String.class.newInstance();
Method m = String.class.getMethod("length");
int length = (int) m.invoke(s)
Получава метода за дължина на класа String и го извиква на String s

„Уау! Това е наистина страхотно!“