SlideShare a Scribd company logo
Java-классы: взгляд изнутри
Алексей Владыкин
27 октября 2014
Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 1 / 29
1 Reflection API
2 Расположение объекта в памяти
3 Байткод Java
Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 2 / 29
Reflection API
Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 3 / 29
Reflection API
Reflection API — программный интерфейс для получения
информации об объектах и классах во время исполнения
программы
Пакет java.lang.reflect
Для каждого типа, в том числе примитивного, можно получить
описывающий его экземпляр класса Class
Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 4 / 29
Reflection API
Возможности Reflection API
Получение списка конструкторов, методов и полей класса
Создание экземпляров класса
Вызов методов и чтение/запись полей, в том числе закрытых
Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 5 / 29
Reflection API
Как получить Class
Получение класса по объекту:
Class c1 = object.getClass();
Получение класса через литерал:
Class c2 = String[].class;
Class c3 = int.class;
Загрузка класса по имени:
Class c4 = Class.forName("java.lang.Integer");
Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 6 / 29
Reflection API
Как загрузить класс с диска
URL jarFileURL =
Paths.get("library.jar"). toUri (). toURL ();
ClassLoader classLoader =
new URLClassLoader(new URL[] {jarFileURL });
Class clazz = classLoader.loadClass(
"ru.csc.java2014.DemoClass");
Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 7 / 29
Reflection API
Имя класса
int[] Object[] Foo.Bar
getName() [I [Ljava.lang.Object; Foo$Bar
getCanonicalName() int[] java.lang.Object[] Foo.Bar
getSimpleName() int[] Object[] Bar
Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 8 / 29
Reflection API
Типы классов
boolean isPrimitive()
boolean isArray()
boolean isEnum()
boolean isInterface()
boolean isAnnotation()
Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 9 / 29
Reflection API
Специфика массивов
if (clazz.isArray ()) {
System.out.println(
"Array of " + c.getComponentType ());
}
Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 10 / 29
Reflection API
Специфика enum
if (clazz.isEnum ()) {
System.out.println("Enum of:");
for (Object e : clazz.getEnumConstants ()) {
System.out.println(e);
}
}
Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 11 / 29
Reflection API
Конструкторы
Открытые конструкторы:
Constructor getConstructor(Class... types)
Constructor[] getConstructors()
Все конструкторы:
Constructor getDeclaredConstructor(Class... types)
Constructor[] getDeclaredConstructors()
Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 12 / 29
Reflection API
Вызов конструктора
Constructor constructor =
clazz.getConstructor(String.class );
Object instance =
constructor.newInstance("Hello World!");
Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 13 / 29
Reflection API
Методы
Открытые методы, в том числе унаследованные:
Method getMethod(String name, Class... types)
Method[] getMethods()
Все методы, но только из текущего класса:
Method getDeclaredMethod(String name, Class... types)
Method[] getDeclaredMethods()
Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 14 / 29
Reflection API
Вызов метода
Method method =
clazz.getMethod("doSomething", int.class );
Object result =
method.invoke(instance , 42);
Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 15 / 29
Reflection API
Поля
Открытые поля, в том числе унаследованные:
Field getField(String name)
Field[] getFields()
Все поля, но только из текущего класса:
Field getDeclaredField(String name)
Field[] getDeclaredFields()
Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 16 / 29
Reflection API
Чтение/запись поля
Field field = clazz.getDeclaredField("x");
field.setAccessible(true );
Object value = field.get(instance );
field.set(instance , null );
Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 17 / 29
Reflection API
Аннотации
Version version =
clazz.getAnnotation(Version.class );
if (version != null) {
System.out.println(version.value ());
System.out.println(version.date ());
}
Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 18 / 29
Расположение объекта в памяти
Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 19 / 29
Расположение объекта в памяти
Инструмент JOL
Демо
Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 20 / 29
Байткод Java
Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 21 / 29
Байткод Java
Структура .class файла
Заголовок (CAFEBABE, версия формата)
Constant pool (числа, строки, имена классов, полей и методов)
Объявление класса (модификаторы, имя класса, имя суперкласса,
имена реализуемых интерфейсов)
Поля класса
Методы класса
Атрибуты класса (аннотации, debug info, . . . )
javap -v -p ru.csc.java2014.DemoClass
Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 22 / 29
Байткод Java
Имена в байткоде
Никаких импортов, все имена полные
Имена классов: java/lang/String
Имена типов:
B, C, D, F, I, J, S, Z
Ljava/lang/Object;
[[I
Имена методов:
<init> ()V
<clinit> ()V
equals (Ljava/lang/Object;)Z
toString ()Ljava/lang/String;
sort ([III)V
Имена параметров и локальных переменных отсутствуют
Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 23 / 29
Байткод Java
Исполняемый код
Состоит из простых инструкций (около 200)
Работает в рамках одного фрейма стека вызовов
Имеет локальный стек заданного размера, где и выполняет все
вычисления
Может обращаться к полям и методам объектов, а также к своим
аргументам и локальным переменным
Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 24 / 29
Байткод Java
Стековая арифметика
2 + 3 · 4
2 3 4 · +
iconst_2
iconst_3
iconst_4
imul
iadd
Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 25 / 29
Байткод Java
Основные инструкции
Значения в стеке и локальных переменных:
*const*, ldc*, *load*, *store*
Арифметика:
*mul, *div, *add, *sub
Работа с объектами:
new, getfield, putfield, getstatic, putstatic
Вызовы методов:
invokestatic, invokevirtual, invokespecial, *return
Проверки и переходы:
*cmp, if*, goto*
Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 26 / 29
Байткод Java
Библиотека ASM
Демо
Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 27 / 29
Байткод Java
Зачем работать с байткодом?
Альтернативные языки для JVM
Статический и динамический анализ кода
Enterprise фреймворки
Библиотеки для mock’ов
Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 28 / 29
Что сегодня узнали
Что такое Reflection API и какие возможности он предоставляет
Как узнать, сколько места занимает объект и как расположены
его поля в памяти
Как устроен байткод Java, и что это дает
Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 29 / 29

More Related Content

What's hot

07 - Java. Элементы функционального программирования в Java
07 - Java. Элементы функционального программирования в Java07 - Java. Элементы функционального программирования в Java
07 - Java. Элементы функционального программирования в Java
Roman Brovko
 
C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.
Igor Shkulipa
 
C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.
Igor Shkulipa
 
C++ STL & Qt. Занятие 03.
C++ STL & Qt. Занятие 03.C++ STL & Qt. Занятие 03.
C++ STL & Qt. Занятие 03.
Igor Shkulipa
 
C# Desktop. Занятие 01.
C# Desktop. Занятие 01.C# Desktop. Занятие 01.
C# Desktop. Занятие 01.
Igor Shkulipa
 
C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.
Igor Shkulipa
 
объектно ориентированная платформа для построения
объектно ориентированная платформа для построенияобъектно ориентированная платформа для построения
объектно ориентированная платформа для построения
Gennady Zavyalov
 
C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.
Igor Shkulipa
 
C# Desktop. Занятие 02.
C# Desktop. Занятие 02.C# Desktop. Занятие 02.
C# Desktop. Занятие 02.
Igor Shkulipa
 
C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.
Igor Shkulipa
 
Java. Сборщик мусора. Работа с памятью.
Java.  Сборщик мусора. Работа с памятью. Java.  Сборщик мусора. Работа с памятью.
Java. Сборщик мусора. Работа с памятью.
Unguryan Vitaliy
 
C# Desktop. Занятие 04.
C# Desktop. Занятие 04.C# Desktop. Занятие 04.
C# Desktop. Занятие 04.
Igor Shkulipa
 
C++ STL & Qt. Занятие 08.
C++ STL & Qt. Занятие 08.C++ STL & Qt. Занятие 08.
C++ STL & Qt. Занятие 08.
Igor Shkulipa
 

What's hot (13)

07 - Java. Элементы функционального программирования в Java
07 - Java. Элементы функционального программирования в Java07 - Java. Элементы функционального программирования в Java
07 - Java. Элементы функционального программирования в Java
 
C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.
 
C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.
 
C++ STL & Qt. Занятие 03.
C++ STL & Qt. Занятие 03.C++ STL & Qt. Занятие 03.
C++ STL & Qt. Занятие 03.
 
C# Desktop. Занятие 01.
C# Desktop. Занятие 01.C# Desktop. Занятие 01.
C# Desktop. Занятие 01.
 
C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.
 
объектно ориентированная платформа для построения
объектно ориентированная платформа для построенияобъектно ориентированная платформа для построения
объектно ориентированная платформа для построения
 
C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.
 
C# Desktop. Занятие 02.
C# Desktop. Занятие 02.C# Desktop. Занятие 02.
C# Desktop. Занятие 02.
 
C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.
 
Java. Сборщик мусора. Работа с памятью.
Java.  Сборщик мусора. Работа с памятью. Java.  Сборщик мусора. Работа с памятью.
Java. Сборщик мусора. Работа с памятью.
 
C# Desktop. Занятие 04.
C# Desktop. Занятие 04.C# Desktop. Занятие 04.
C# Desktop. Занятие 04.
 
C++ STL & Qt. Занятие 08.
C++ STL & Qt. Занятие 08.C++ STL & Qt. Занятие 08.
C++ STL & Qt. Занятие 08.
 

Similar to 08 - Java. Java-классы: взгляд изнутри

Классы и объекты С#
Классы и объекты С#Классы и объекты С#
Продвинутое использование Celery — Александр Кошелев
Продвинутое использование Celery — Александр КошелевПродвинутое использование Celery — Александр Кошелев
Продвинутое использование Celery — Александр Кошелев
Yandex
 
Oop java.generics
Oop java.genericsOop java.generics
Oop java.generics
muqaddas_m
 
Наследование и полиморфизм
Наследование и полиморфизмНаследование и полиморфизм
Наследование и полиморфизм
Ural Federal University named after First President of Russia B.N. Yeltsin
 
Рефлексия в java
Рефлексия в javaРефлексия в java
Рефлексия в java
Unguryan Vitaliy
 
Android - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, genericsAndroid - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, genericsNoveo
 
Елена Жукова "Жизнь вне JavaScript"
Елена Жукова "Жизнь вне JavaScript"Елена Жукова "Жизнь вне JavaScript"
Елена Жукова "Жизнь вне JavaScript"
Fwdays
 
Методы защиты Java-приложений и их обход
Методы защиты Java-приложений и их обходМетоды защиты Java-приложений и их обход
Методы защиты Java-приложений и их обход
Positive Hack Days
 
Java. OOP
Java. OOPJava. OOP
Java. OOP
Tanya Mykhnevych
 
Java 2 - Java Intro
Java 2 - Java IntroJava 2 - Java Intro
Java 2 - Java Intro
Alexander Babich
 
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
Dev_Party
 
Java осень 2014 занятие 1
Java осень 2014 занятие 1Java осень 2014 занятие 1
Java осень 2014 занятие 1
Technopark
 
Загрузчики классов в Java - коллекция граблей
Загрузчики классов в Java - коллекция граблейЗагрузчики классов в Java - коллекция граблей
Загрузчики классов в Java - коллекция граблейAnton Arhipov
 
C# Desktop. Занятие 13.
C# Desktop. Занятие 13.C# Desktop. Занятие 13.
C# Desktop. Занятие 13.
Igor Shkulipa
 
jQuery как путь к RIA
jQuery как путь к RIAjQuery как путь к RIA
jQuery как путь к RIA
GetDev.NET
 
«MVVM в Swift», Александр Зимин, независимый iOS-разработчик
«MVVM в Swift», Александр Зимин, независимый iOS-разработчик«MVVM в Swift», Александр Зимин, независимый iOS-разработчик
«MVVM в Swift», Александр Зимин, независимый iOS-разработчик
Mail.ru Group
 
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Kirill Chebunin
 
презентация конспекта лекций
презентация конспекта лекцийпрезентация конспекта лекций
презентация конспекта лекцийstudent_kai
 
Kozhemyakin dcm2011 1
Kozhemyakin dcm2011 1Kozhemyakin dcm2011 1
Kozhemyakin dcm2011 1drupalconf
 
Java Core. Lecture# 1. Intro
Java Core. Lecture# 1. IntroJava Core. Lecture# 1. Intro
Java Core. Lecture# 1. Intro
Anton Moiseenko
 

Similar to 08 - Java. Java-классы: взгляд изнутри (20)

Классы и объекты С#
Классы и объекты С#Классы и объекты С#
Классы и объекты С#
 
Продвинутое использование Celery — Александр Кошелев
Продвинутое использование Celery — Александр КошелевПродвинутое использование Celery — Александр Кошелев
Продвинутое использование Celery — Александр Кошелев
 
Oop java.generics
Oop java.genericsOop java.generics
Oop java.generics
 
Наследование и полиморфизм
Наследование и полиморфизмНаследование и полиморфизм
Наследование и полиморфизм
 
Рефлексия в java
Рефлексия в javaРефлексия в java
Рефлексия в java
 
Android - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, genericsAndroid - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, generics
 
Елена Жукова "Жизнь вне JavaScript"
Елена Жукова "Жизнь вне JavaScript"Елена Жукова "Жизнь вне JavaScript"
Елена Жукова "Жизнь вне JavaScript"
 
Методы защиты Java-приложений и их обход
Методы защиты Java-приложений и их обходМетоды защиты Java-приложений и их обход
Методы защиты Java-приложений и их обход
 
Java. OOP
Java. OOPJava. OOP
Java. OOP
 
Java 2 - Java Intro
Java 2 - Java IntroJava 2 - Java Intro
Java 2 - Java Intro
 
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
 
Java осень 2014 занятие 1
Java осень 2014 занятие 1Java осень 2014 занятие 1
Java осень 2014 занятие 1
 
Загрузчики классов в Java - коллекция граблей
Загрузчики классов в Java - коллекция граблейЗагрузчики классов в Java - коллекция граблей
Загрузчики классов в Java - коллекция граблей
 
C# Desktop. Занятие 13.
C# Desktop. Занятие 13.C# Desktop. Занятие 13.
C# Desktop. Занятие 13.
 
jQuery как путь к RIA
jQuery как путь к RIAjQuery как путь к RIA
jQuery как путь к RIA
 
«MVVM в Swift», Александр Зимин, независимый iOS-разработчик
«MVVM в Swift», Александр Зимин, независимый iOS-разработчик«MVVM в Swift», Александр Зимин, независимый iOS-разработчик
«MVVM в Swift», Александр Зимин, независимый iOS-разработчик
 
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОП
 
презентация конспекта лекций
презентация конспекта лекцийпрезентация конспекта лекций
презентация конспекта лекций
 
Kozhemyakin dcm2011 1
Kozhemyakin dcm2011 1Kozhemyakin dcm2011 1
Kozhemyakin dcm2011 1
 
Java Core. Lecture# 1. Intro
Java Core. Lecture# 1. IntroJava Core. Lecture# 1. Intro
Java Core. Lecture# 1. Intro
 

More from Roman Brovko

Individual task Networking
Individual task NetworkingIndividual task Networking
Individual task Networking
Roman Brovko
 
Networking essentials lect3
Networking essentials lect3Networking essentials lect3
Networking essentials lect3
Roman Brovko
 
Gl embedded starterkit_ethernet
Gl embedded starterkit_ethernetGl embedded starterkit_ethernet
Gl embedded starterkit_ethernet
Roman Brovko
 
Networking essentials lect2
Networking essentials lect2Networking essentials lect2
Networking essentials lect2
Roman Brovko
 
Networking essentials lect1
Networking essentials lect1Networking essentials lect1
Networking essentials lect1
Roman Brovko
 
Bare metal training_07_spi_flash
Bare metal training_07_spi_flashBare metal training_07_spi_flash
Bare metal training_07_spi_flash
Roman Brovko
 
Bare metal training_06_I2C
Bare metal training_06_I2CBare metal training_06_I2C
Bare metal training_06_I2C
Roman Brovko
 
Glesk worshop
Glesk worshopGlesk worshop
Glesk worshop
Roman Brovko
 
Bare metal training_05_uart
Bare metal training_05_uartBare metal training_05_uart
Bare metal training_05_uart
Roman Brovko
 
Bare metal training_04_adc_temp_sensor
Bare metal training_04_adc_temp_sensorBare metal training_04_adc_temp_sensor
Bare metal training_04_adc_temp_sensor
Roman Brovko
 
Bare metal training_03_timers_pwm
Bare metal training_03_timers_pwmBare metal training_03_timers_pwm
Bare metal training_03_timers_pwm
Roman Brovko
 
Bare metal training_02_le_ds_and_buttons
Bare metal training_02_le_ds_and_buttonsBare metal training_02_le_ds_and_buttons
Bare metal training_02_le_ds_and_buttons
Roman Brovko
 
Bare metal training_01_hello_world
Bare metal training_01_hello_worldBare metal training_01_hello_world
Bare metal training_01_hello_world
Roman Brovko
 
Bare metal training_00_prerequisites
Bare metal training_00_prerequisitesBare metal training_00_prerequisites
Bare metal training_00_prerequisites
Roman Brovko
 
C language lect_23_advanced
C language lect_23_advancedC language lect_23_advanced
C language lect_23_advanced
Roman Brovko
 
C language lect_22_advanced
C language lect_22_advancedC language lect_22_advanced
C language lect_22_advanced
Roman Brovko
 
C language lect_21_advanced
C language lect_21_advancedC language lect_21_advanced
C language lect_21_advanced
Roman Brovko
 
подготовка рабочего окружения
подготовка рабочего окруженияподготовка рабочего окружения
подготовка рабочего окружения
Roman Brovko
 
C language lect_20_advanced
C language lect_20_advancedC language lect_20_advanced
C language lect_20_advanced
Roman Brovko
 
C language lect_19_basics
C language lect_19_basicsC language lect_19_basics
C language lect_19_basics
Roman Brovko
 

More from Roman Brovko (20)

Individual task Networking
Individual task NetworkingIndividual task Networking
Individual task Networking
 
Networking essentials lect3
Networking essentials lect3Networking essentials lect3
Networking essentials lect3
 
Gl embedded starterkit_ethernet
Gl embedded starterkit_ethernetGl embedded starterkit_ethernet
Gl embedded starterkit_ethernet
 
Networking essentials lect2
Networking essentials lect2Networking essentials lect2
Networking essentials lect2
 
Networking essentials lect1
Networking essentials lect1Networking essentials lect1
Networking essentials lect1
 
Bare metal training_07_spi_flash
Bare metal training_07_spi_flashBare metal training_07_spi_flash
Bare metal training_07_spi_flash
 
Bare metal training_06_I2C
Bare metal training_06_I2CBare metal training_06_I2C
Bare metal training_06_I2C
 
Glesk worshop
Glesk worshopGlesk worshop
Glesk worshop
 
Bare metal training_05_uart
Bare metal training_05_uartBare metal training_05_uart
Bare metal training_05_uart
 
Bare metal training_04_adc_temp_sensor
Bare metal training_04_adc_temp_sensorBare metal training_04_adc_temp_sensor
Bare metal training_04_adc_temp_sensor
 
Bare metal training_03_timers_pwm
Bare metal training_03_timers_pwmBare metal training_03_timers_pwm
Bare metal training_03_timers_pwm
 
Bare metal training_02_le_ds_and_buttons
Bare metal training_02_le_ds_and_buttonsBare metal training_02_le_ds_and_buttons
Bare metal training_02_le_ds_and_buttons
 
Bare metal training_01_hello_world
Bare metal training_01_hello_worldBare metal training_01_hello_world
Bare metal training_01_hello_world
 
Bare metal training_00_prerequisites
Bare metal training_00_prerequisitesBare metal training_00_prerequisites
Bare metal training_00_prerequisites
 
C language lect_23_advanced
C language lect_23_advancedC language lect_23_advanced
C language lect_23_advanced
 
C language lect_22_advanced
C language lect_22_advancedC language lect_22_advanced
C language lect_22_advanced
 
C language lect_21_advanced
C language lect_21_advancedC language lect_21_advanced
C language lect_21_advanced
 
подготовка рабочего окружения
подготовка рабочего окруженияподготовка рабочего окружения
подготовка рабочего окружения
 
C language lect_20_advanced
C language lect_20_advancedC language lect_20_advanced
C language lect_20_advanced
 
C language lect_19_basics
C language lect_19_basicsC language lect_19_basics
C language lect_19_basics
 

08 - Java. Java-классы: взгляд изнутри

  • 1. Java-классы: взгляд изнутри Алексей Владыкин 27 октября 2014 Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 1 / 29
  • 2. 1 Reflection API 2 Расположение объекта в памяти 3 Байткод Java Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 2 / 29
  • 3. Reflection API Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 3 / 29
  • 4. Reflection API Reflection API — программный интерфейс для получения информации об объектах и классах во время исполнения программы Пакет java.lang.reflect Для каждого типа, в том числе примитивного, можно получить описывающий его экземпляр класса Class Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 4 / 29
  • 5. Reflection API Возможности Reflection API Получение списка конструкторов, методов и полей класса Создание экземпляров класса Вызов методов и чтение/запись полей, в том числе закрытых Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 5 / 29
  • 6. Reflection API Как получить Class Получение класса по объекту: Class c1 = object.getClass(); Получение класса через литерал: Class c2 = String[].class; Class c3 = int.class; Загрузка класса по имени: Class c4 = Class.forName("java.lang.Integer"); Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 6 / 29
  • 7. Reflection API Как загрузить класс с диска URL jarFileURL = Paths.get("library.jar"). toUri (). toURL (); ClassLoader classLoader = new URLClassLoader(new URL[] {jarFileURL }); Class clazz = classLoader.loadClass( "ru.csc.java2014.DemoClass"); Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 7 / 29
  • 8. Reflection API Имя класса int[] Object[] Foo.Bar getName() [I [Ljava.lang.Object; Foo$Bar getCanonicalName() int[] java.lang.Object[] Foo.Bar getSimpleName() int[] Object[] Bar Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 8 / 29
  • 9. Reflection API Типы классов boolean isPrimitive() boolean isArray() boolean isEnum() boolean isInterface() boolean isAnnotation() Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 9 / 29
  • 10. Reflection API Специфика массивов if (clazz.isArray ()) { System.out.println( "Array of " + c.getComponentType ()); } Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 10 / 29
  • 11. Reflection API Специфика enum if (clazz.isEnum ()) { System.out.println("Enum of:"); for (Object e : clazz.getEnumConstants ()) { System.out.println(e); } } Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 11 / 29
  • 12. Reflection API Конструкторы Открытые конструкторы: Constructor getConstructor(Class... types) Constructor[] getConstructors() Все конструкторы: Constructor getDeclaredConstructor(Class... types) Constructor[] getDeclaredConstructors() Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 12 / 29
  • 13. Reflection API Вызов конструктора Constructor constructor = clazz.getConstructor(String.class ); Object instance = constructor.newInstance("Hello World!"); Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 13 / 29
  • 14. Reflection API Методы Открытые методы, в том числе унаследованные: Method getMethod(String name, Class... types) Method[] getMethods() Все методы, но только из текущего класса: Method getDeclaredMethod(String name, Class... types) Method[] getDeclaredMethods() Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 14 / 29
  • 15. Reflection API Вызов метода Method method = clazz.getMethod("doSomething", int.class ); Object result = method.invoke(instance , 42); Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 15 / 29
  • 16. Reflection API Поля Открытые поля, в том числе унаследованные: Field getField(String name) Field[] getFields() Все поля, но только из текущего класса: Field getDeclaredField(String name) Field[] getDeclaredFields() Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 16 / 29
  • 17. Reflection API Чтение/запись поля Field field = clazz.getDeclaredField("x"); field.setAccessible(true ); Object value = field.get(instance ); field.set(instance , null ); Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 17 / 29
  • 18. Reflection API Аннотации Version version = clazz.getAnnotation(Version.class ); if (version != null) { System.out.println(version.value ()); System.out.println(version.date ()); } Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 18 / 29
  • 19. Расположение объекта в памяти Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 19 / 29
  • 20. Расположение объекта в памяти Инструмент JOL Демо Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 20 / 29
  • 21. Байткод Java Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 21 / 29
  • 22. Байткод Java Структура .class файла Заголовок (CAFEBABE, версия формата) Constant pool (числа, строки, имена классов, полей и методов) Объявление класса (модификаторы, имя класса, имя суперкласса, имена реализуемых интерфейсов) Поля класса Методы класса Атрибуты класса (аннотации, debug info, . . . ) javap -v -p ru.csc.java2014.DemoClass Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 22 / 29
  • 23. Байткод Java Имена в байткоде Никаких импортов, все имена полные Имена классов: java/lang/String Имена типов: B, C, D, F, I, J, S, Z Ljava/lang/Object; [[I Имена методов: <init> ()V <clinit> ()V equals (Ljava/lang/Object;)Z toString ()Ljava/lang/String; sort ([III)V Имена параметров и локальных переменных отсутствуют Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 23 / 29
  • 24. Байткод Java Исполняемый код Состоит из простых инструкций (около 200) Работает в рамках одного фрейма стека вызовов Имеет локальный стек заданного размера, где и выполняет все вычисления Может обращаться к полям и методам объектов, а также к своим аргументам и локальным переменным Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 24 / 29
  • 25. Байткод Java Стековая арифметика 2 + 3 · 4 2 3 4 · + iconst_2 iconst_3 iconst_4 imul iadd Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 25 / 29
  • 26. Байткод Java Основные инструкции Значения в стеке и локальных переменных: *const*, ldc*, *load*, *store* Арифметика: *mul, *div, *add, *sub Работа с объектами: new, getfield, putfield, getstatic, putstatic Вызовы методов: invokestatic, invokevirtual, invokespecial, *return Проверки и переходы: *cmp, if*, goto* Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 26 / 29
  • 27. Байткод Java Библиотека ASM Демо Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 27 / 29
  • 28. Байткод Java Зачем работать с байткодом? Альтернативные языки для JVM Статический и динамический анализ кода Enterprise фреймворки Библиотеки для mock’ов Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 28 / 29
  • 29. Что сегодня узнали Что такое Reflection API и какие возможности он предоставляет Как узнать, сколько места занимает объект и как расположены его поля в памяти Как устроен байткод Java, и что это дает Алексей Владыкин Java-классы: взгляд изнутри 27 октября 2014 29 / 29