Java for Beginner
675 subscribers
546 photos
155 videos
12 files
838 links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Базовые понятия и практическое применение Reflection API

Класс Class<T>: что это такое и зачем он нужен

Класс Class<T> — это основа Reflection API. Он представляет собой метаинформацию о классе или интерфейсе.

Каждый класс в Java имеет соответствующий объект Class, который можно использовать для:
Получения информации о классе (поля, методы, конструкторы).
Создания экземпляров класса.
Вызова методов и доступа к полям.


Как получить объект Class

Через .class:
Class<String> stringClass = String.class;
Этот способ работает для любого типа, включая примитивы и массивы.


Через метод getClass():
String str = "Hello";
Class<?> stringClass = str.getClass();
Этот метод доступен для всех объектов и возвращает класс их экземпляра.


Через Class.forName():
Class<?> stringClass = Class.forName("java.lang.String");
Этот метод полезен, когда имя класса известно только во время выполнения.


Практическое применение: примеры получения объекта Class

Для примитивов:
Class<?> intClass = int.class;
System.out.println(intClass.getName()); // Вывод: int


Для классов:
Class<?> stringClass = String.class;
System.out.println(stringClass.getName()); // Вывод: java.lang.String


Для массивов:
Class<?> arrayClass = int[].class;
System.out.println(arrayClass.getName());


Для анонимных классов:
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("Running");
}
};
Class<?> anonymousClass = runnable.getClass();
System.out.println(anonymousClass.getName()); // Вывод: com.example.Main$1


#Java #Training #Medium #Reflection_API #Class
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Класс Class и его методы.

Класс Class в Java является частью Reflection API и представляет собой метаинформацию о классах и интерфейсах. Каждый объект в Java имеет ассоциированный объект Class, который можно использовать для получения информации о классе, его методах, полях, конструкторах и аннотациях.

Получение объекта Class

Объект Class можно получить несколькими способами:
Через объект: obj.getClass()
Через имя класса: Class.forName("полное.имя.класса")
Через литерал класса: ClassName.class


Пример:
String str = "Hello";
Class<?> strClass = str.getClass(); // Получаем Class для объекта String
Class<?> intClass = int.class; // Получаем Class для примитива int
Class<?> arrClass = String[].class; // Получаем Class для массива String[]


Методы для получения информации о классе

getName()
Возвращает полное имя класса, включая пакет.

Пример:
Class<?> strClass = String.class;
System.out.println(strClass.getName()); // Вывод: java.lang.String


getSimpleName()
Возвращает простое имя класса (без пакета).

Пример:
System.out.println(strClass.getSimpleName()); // Вывод: String


getPackage()
Возвращает объект Package, представляющий пакет, в котором находится класс.

Пример:
Package pkg = strClass.getPackage();
System.out.println(pkg.getName()); // Вывод: java.lang


getModifiers()
Возвращает модификаторы класса в виде целого числа. Для расшифровки используется класс Modifier.

Пример:
int modifiers = strClass.getModifiers();
System.out.println(Modifier.isPublic(modifiers)); // Вывод: true
System.out.println(Modifier.isFinal(modifiers)); // Вывод: true


Пример получения информации о классе
public class Main {
public static void main(String[] args) {
Class<?> clazz = String.class;
System.out.println("Class Name: " + clazz.getName());
System.out.println("Simple Name: " + clazz.getSimpleName());
System.out.println("Package: " + clazz.getPackage().getName());
System.out.println("Is Public: " + Modifier.isPublic(clazz.getModifiers()));
}
}


#Java #Training #Medium #Reflection_API #Class
Что выведет код?

public class Task050225 {
public static void main(String[] args) {
int x = 10;
int y = 20;
int z = 15;

int result = (x > y) ? (x > z ? x : z) : (y > z ? y : z);
System.out.println(result);
}
}


#Tasks
Варианты ответа:
Anonymous Quiz
3%
10
11%
15
57%
20
29%
Ошибка компиляции
Вы на его глаза посмотрите, помоему он в шоке 🤣

https://t.me/Java_for_beginner_dev

#Mems
Please open Telegram to view this post
VIEW IN TELEGRAM
Вопросы с собеседования 👩‍💻

Какие примитивные типы данных есть в Java?
Anonymous Quiz
2%
String, int, float, boolean
92%
byte, short, int, long, float, double, char, boolean
2%
Integer, Double, Boolean, Char
4%
Все типы в Java являются объектами.
Класс Class и его методы. Часть 2

Получение информации о суперклассе и интерфейсах

getSuperclass()
Возвращает Class объекта, представляющего суперкласс текущего класса. Если класс не имеет суперкласса (например, Object), возвращается null.

Пример:
Class<?> arrayListClass = ArrayList.class;
Class<?> superClass = arrayListClass.getSuperclass();
System.out.println(superClass.getName()); // Вывод: java.util.AbstractList


getInterfaces()
Возвращает массив Class объектов, представляющих интерфейсы, реализованные классом.

Пример:
Class<?>[] interfaces = arrayListClass.getInterfaces();
for (Class<?> iface : interfaces) {
System.out.println(iface.getName()); // Вывод: java.util.List, java.util.RandomAccess и т.д.
}


Работа с аннотациями

getAnnotations()
Возвращает массив всех аннотаций, присутствующих на классе, включая унаследованные.

Пример:
@Deprecated
class MyClass {}

Class<?> myClass = MyClass.class;
Annotation[] annotations = myClass.getAnnotations();
for (Annotation ann : annotations) {
System.out.println(ann.annotationType().getName()); // Вывод: java.lang.Deprecated
}


getDeclaredAnnotations()

Возвращает массив всех аннотаций, непосредственно объявленных на классе (без унаследованных).

Пример:
Annotation[] declaredAnnotations = myClass.getDeclaredAnnotations();
for (Annotation ann : declaredAnnotations) {
System.out.println(ann.annotationType().getName()); // Вывод: java.lang.Deprecated
}


Пример получения информации о суперклассе и аннотациях
public class Main {
public static void main(String[] args) {
Class<?> clazz = ArrayList.class;

// Суперкласс
Class<?> superClass = clazz.getSuperclass();
System.out.println("Superclass: " + superClass.getName());

// Интерфейсы
Class<?>[] interfaces = clazz.getInterfaces();
for (Class<?> iface : interfaces) {
System.out.println("Interface: " + iface.getName());
}

// Аннотации
Annotation[] annotations = clazz.getAnnotations();
for (Annotation ann : annotations) {
System.out.println("Annotation: " + ann.annotationType().getName());
}
}
}


#Java #Training #Medium #Reflection_API #Class
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Получение информации о полях.

Поле класса — это переменная, объявленная внутри класса. Оно может быть статическим или нестатическим, публичным, приватным или защищенным. Reflection API позволяет получать информацию о полях класса, включая их типы, модификаторы и значения.

Получение полей класса

getFields()
Возвращает массив всех публичных полей класса, включая унаследованные от суперклассов.

Пример:
import java.lang.reflect.Field;

class Parent {
public String parentField = "Parent Field";
}

class Child extends Parent {
public String childField = "Child Field";
private int privateField = 42;
}

public class Main {
public static void main(String[] args) {
Class<?> clazz = Child.class;
Field[] fields = clazz.getFields();
for (Field field : fields) {
System.out.println("Field: " + field.getName()); // Вывод: parentField, childField
}
}
}


getDeclaredFields()
Возвращает массив всех полей, объявленных в классе, включая приватные и защищенные, но не включает унаследованные поля.

Пример:
Field[] declaredFields = clazz.getDeclaredFields();
for (Field field : declaredFields) {
System.out.println("Declared Field: " + field.getName()); // Вывод: childField, privateField
}


Работа с модификаторами полей


getModifiers()

Возвращает модификаторы поля в виде целого числа. Для расшифровки используется класс Modifier.

Пример:
Field privateField = clazz.getDeclaredField("privateField");
int modifiers = privateField.getModifiers();
System.out.println("Is Private: " + Modifier.isPrivate(modifiers)); // Вывод: true
System.out.println("Is Static: " + Modifier.isStatic(modifiers)); // Вывод: false


getType()
Возвращает тип поля в виде объекта Class.

Пример:
Class<?> fieldType = privateField.getType();
System.out.println("Field Type: " + fieldType.getName()); // Вывод: int


#Java #Training #Medium #Reflection_API #Field
Что выведет код?

public class Task060225 {
public static void main(String[] args) {
String s = "hello";
String sub = s.substring(1, 3);
System.out.println(sub);
}
}


#Tasks
Варианты ответа:
Anonymous Quiz
9%
hello
7%
llo
78%
el
7%
he
По-моему мало одного? 💪😋

https://t.me/Java_for_beginner_dev

#Mems
Please open Telegram to view this post
VIEW IN TELEGRAM
Получение информации о полях. Часть 2

Пример получения информации о полях

Рассмотрим более сложный пример, где мы получаем информацию о всех полях класса, включая их типы и модификаторы.
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

class Example {
public String publicField = "Public Field";
private int privateField = 42;
protected static final double PROTECTED_FIELD = 3.14;
}

public class Main {
public static void main(String[] args) throws Exception {
Class<?> clazz = Example.class;

// Получаем все поля (публичные и унаследованные)
Field[] fields = clazz.getFields();
System.out.println("Public Fields:");
for (Field field : fields) {
System.out.println(" Name: " + field.getName());
System.out.println(" Type: " + field.getType().getName());
System.out.println(" Modifiers: " + Modifier.toString(field.getModifiers()));
}

// Получаем все объявленные поля (включая приватные и защищенные)
Field[] declaredFields = clazz.getDeclaredFields();
System.out.println("Declared Fields:");
for (Field field : declaredFields) {
System.out.println(" Name: " + field.getName());
System.out.println(" Type: " + field.getType().getName());
System.out.println(" Modifiers: " + Modifier.toString(field.getModifiers()));
}
}
}


Вывод программы
Public Fields:
Name: publicField
Type: java.lang.String
Modifiers: public
Declared Fields:
Name: publicField
Type: java.lang.String
Modifiers: public
Name: privateField
Type: int
Modifiers: private
Name: PROTECTED_FIELD
Type: double
Modifiers: protected static final


Нюансы использования

Доступ к приватным полям:
По умолчанию приватные поля недоступны через getFields(). Для доступа к ним нужно использовать getDeclaredFields() и вызвать метод setAccessible(true).

Пример:
Field privateField = clazz.getDeclaredField("privateField");
privateField.setAccessible(true); // Разрешаем доступ к приватному полю
System.out.println("Private Field Value: " + privateField.get(new Example())); // Вывод: 42


Статические поля:

Для получения значения статического поля можно передать null в метод get().

Пример:
Field staticField = clazz.getDeclaredField("PROTECTED_FIELD");
staticField.setAccessible(true);
System.out.println("Static Field Value: " + staticField.get(null)); // Вывод: 3.14


#Java #Training #Medium #Reflection_API #Field
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Получение информации о методах.

Класс Method в Java является частью Reflection API и представляет собой метаинформацию о методах класса. С помощью этого класса можно получить информацию о методах, их параметрах, возвращаемых типах и аннотациях.

Что такое метод класса и как его получить

Метод класса — это блок кода, который выполняет определенную задачу.

В Java методы могут быть:
Публичными (public): доступны из любого класса.
Приватными (private): доступны только внутри класса.
Защищенными (protected): доступны внутри класса и его подклассов.
По умолчанию (без модификатора): доступны внутри пакета.


Для получения методов класса используются методы:

getMethods()
Возвращает массив всех публичных методов класса, включая унаследованные от суперклассов и интерфейсов.

Пример:
Class<?> clazz = String.class;
Method[] methods = clazz.getMethods();
for (Method method : methods) {
System.out.println(method.getName());
}


getDeclaredMethods()
Возвращает массив всех методов, объявленных в классе (включая приватные и защищенные), но не включает унаследованные методы.

Пример:
Method[] declaredMethods = clazz.getDeclaredMethods();
for (Method method : declaredMethods) {
System.out.println(method.getName());
}


Пример получения методов класса
import java.lang.reflect.Method;

public class Main {
public static void main(String[] args) {
Class<?> clazz = String.class;

// Получение всех публичных методов
System.out.println("Public Methods:");
Method[] methods = clazz.getMethods();
for (Method method : methods) {
System.out.println(method.getName());
}

// Получение всех объявленных методов
System.out.println("\nDeclared Methods:");
Method[] declaredMethods = clazz.getDeclaredMethods();
for (Method method : declaredMethods) {
System.out.println(method.getName());
}
}
}


#Java #Training #Medium #Reflection_API #Method
Что выведет код?

abstract class Shape {
abstract void draw();
}

class Circle extends Shape {
void draw() {
System.out.println("Drawing Circle");
}
}

class Square extends Shape {
void draw() {
System.out.println("Drawing Square");
}
}

public class Task070225 {
public static void main(String[] args) {
Shape shape = new Circle();
shape.draw();
shape = new Square();
shape.draw();
shape = null;
shape.draw();
}
}


#Tasks