- •Особенности языка Java
- •История Java
- •Характерные особенности Java
- •Разработка и выполнение Java приложения:
- •Понятие среды выполнения Java
- •Переносимость языка Java
- •Высокая производительность языка Java
- •Типы Java-приложений
- •Автономное (самостоятельное) приложение – application
- •Апплет – applet
- •Комбинированное приложение
- •Сервлет – servlet
- •Мидлет – midlet
- •Различия между автономными приложениями и апплетами
- •Автономное приложение
- •Апплет
- •Этапы жизненного цикла апплета
- •Этапы жизненного цикла в соответствии со стандартом Sun:
- •Этап инициализации
- •Этап запуска
- •Этап останова
- •Этап уничтожения
- •Этап рисования (перерисовки) окна апплета
- •Отличия Java от C++
- •Конструкторы классов
- •«Сборщик мусора»
- •Типы данных в Java
- •Простые типы
- •Ссылочные (объектные) типы
- •Строки в Java
- •Массивы в Java
- •Классы в Java
- •Особенности реализации
- •Пакеты
- •Управление доступом к элементам класса
- •Поля класса
- •Методы
- •Перегрузка и переопределение методов
- •Ключевые слова THIS и SUPER
- •Интерфейсы в Java
- •Понятие Java API
- •Пакеты ядра Java API (в JDK 1.0):
- •Развитие ядра Java API (в новой версии JDK и в Java 2)
- •Основные понятия AWT
- •Компоненты
- •Контейнеры
- •Компоновки. Менеджеры компоновки
- •События
- •События. Обработка событий
- •Иерархия классов-событий
- •Семантические события и их источники-компоненты AWT
- •Модель делегирования событий
- •Методы, объявленные в интерфейсах для семантических событий
- •Способы реализации блока прослушивания событий от AWT-компонента
- •Понятие класса-адаптера
- •Комбинированное приложение Java. Обработка события WindowEvent
- •Исключения в Java и их обработка
- •Иерархия классов исключений
- •Различия между исключениями Exception и ошибками Error
- •Организация обработки исключений в программе
- •Используемые операторы:
- •Как правильно организовывать обработку исключений
- •Понятия процесса и потока
- •Конструкторы класса Thread
- •Наиболее важные методы класса Thread
- •Способы создания потоков
- •Синхронизация потоков
- •Когда следует использовать синхронизацию потоков?
- •Механизм блокировки объекта
- •Способы использования ключевого слова synchronized
- •Синхронизированные методы
- •Оператор synchronized
- •Преимущества оператора synchronized:
- •Взаимодействие потоков: использование методов wait(), notify(), notifyAll()
- •Стандартные образцы кода использования методов
- •Поток-диспетчер событий AWT
- •Потоки и исключения
- •О группах потоков
- •Технология компонентного программирования JavaBeans
- •Понятие технологии компонентного программирования
- •Этап компиляции
- •Этап разработки
- •Этап создания приложения
- •Этап выполнения
- •Понятие компонентной модели
- •Основные требования к классам Bean-компонентов
- •Соглашения об именах
- •Соглашения об именах для свойств
- •Соглашения об именах для событий
- •Соглашения об именах для методов
- •Использование событий для управления свойствами
- •Связанные свойства
- •Преобразование обычного свойства в связанное
- •Ограниченные свойства
- •Преобразование обычного свойства в ограниченное
- •Ввод-вывод в Java: основные понятия
- •Основные группы классов и интерфейсов пакета java.io
- •Фильтрованные потоки
- •Буферизированные потоки
- •Принципы работы Buffered-потоков
- •Входные потоки
- •Выходные потоки
- •Канальные потоки
- •Синхронизация потоков данных
- •Понятие отражения (рефлексии)
- •Класс java.lang.Class
- •Классы пакета java.lang.reflect
- •Понятие интроспекции
- •Понятие сериализации
- •Обеспечение сериализуемости Bean
- •Выполнение базовой сериализации
- •Пример с сериализацией (см. SerializationDemo.java)
- •Настройка сериализации
- •Методы readObject и writeObject
- •Интерфейс Externalizable
- •Создание экземпляров сериализованных Bean
- •Приложение
- •// Файл HelloApplet.java
- •// Файл MyApplet.java
- •// Файл StringDemo.java
- •// Файл ConstrDemo.java
- •// Фрагменты файла AnimBallsPlus.java
Скачано с сайта http://ivc.clan.su
ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(x);
Метод readObject() интерфейса java.io.Objectlnput возвращает десериализованный объект. Сначала данный метод считывает из потока имя класса, точнее — объект java.io.ObjectStreamClass (при передаче данных об объекте в поток oos сохраняется и соответствующий объект ObjectStreamClass, который содержит информацию о классе, в том числе полное имя класса). Затем метод находит объект java.lang.Class этого класса в обычном пути класса. Как только объект Class найден, JVM размещает экземпляр класса и восстанавливает значения полей, не являющихся transient и static, как в классе, так и в каждом из его сериализуемых суперклассов. Поля, значения которых не встречаются в потоке, устанавливаются в значения по умолчанию. В процессе обработки тип объекта утрачивается, и обычно необходимо выполнить приведение объекта к соответствующему типу.
Например:
FilelnputStream fin = new FileInputStream("data.ser"); ObjectlnputStream ois = new ObjectlnputStreamf(fin); String dataString = (String)ois.readObject();
Data data = (Data)ois.readObject();
Пример с сериализацией (см. SerializationDemo.java)
В программе используется сериализация и десериализация объектов. В методе main() основного класса создается объект object1 класса MyClass. Этот объект имеет три экземплярные переменные типа String, int, double. Данную информацию необходимо сохранить и восстановить.
Создаётся FileOutputStream-объект (fos), который ссылается на файл с именем "serial", и ObjectOutputStream-объект (oos) для этого файлового потока. Затем для сериализации объекта object1 вызывается метод writeObject() класса ObjectOutputStream. Объектный выходной поток сбрасывается и закрывается.
Затем создаётся FileInputStream-объект (fis), который ссылается на файл "serial", и ObjectInputStream-объект (ois) для этого файлового потока. Затем для десериализации ранее сериализованного объекта в object2 используется метод readObject() класса ObjectlnputStream и объектный входной поток закрывается.
Обратите внимание! Класс MyClass реализует интерфейс Serializable. Если не объявить реализацию этого интерфейса, то будет выброшено исключение типа NotSerializableException.
Попробуйте поэкспериментировать с программой, используя в качестве объекта для сериализации экземпляр какого-нибудь другого класса, указывая при объявлении поля сериализуемого класса модификатор transient и т.д.
Настройка сериализации
Иногда необходимо настраивать механизм сериализации. Например, имеется необходимость всегда сохранять одно и то же значение некоторого поля, независимо от его текущего значения. Возможно, нужно устанавливать значения некоторых transient-полей, не сохраненных во время сериализация объекта.
Существует два способа настройки:
1.Поддержка методов readObject() и writeObject().
2.Реализация интерфейса java.io.Externalizable.
В первом случае используется базовый формат для Object-потоков, но при этом осуществляется управление значениями полей объектов, которые записываются в поток. Применяя второй подход, можно полностью управлять считыванием и записью данных на уровне байтов (например, если требуется использовать технику сжатия или криптографического кодирования).
50
Скачано с сайта http://ivc.clan.su
Методы readObject и writeObject
Когда объект некоторого класса сериализуют, передавая ссылку на объект методу writeObject() класса ObjectOutputStream, то, как правило, для перезаписи значения полей объекта, не являющихся static и transient, используется метод defaultWriteObject() в ObjectOutputStream. Можно настроить
способ перезаписи данных путем добавления в класс метода writeObject() с объявлением: private void writeObject(ObjectOutputStream out) throws IOException
Если сериализуемый класс имеет свой собственный метод writeObject(), то этот метод вызывается вместо метода defaultWriteObject() в ObjectOutputStream.
Аналогично, если сериализуемый класс имеет метод readObject() с объявлением: private void readObjec(ObjectlnputStream in)
throws IOException, ClassNotFoundException
и объект класса десериализуется с помощью метода readObject() класса ObjectOutputStream, то именно метод readObject() сериализуемого класса будет использоваться вместо метода defaultReadObiect() в
ObjectlnputStream.
Эти методы не объявляются ни в каком интерфейсе или суперклассе. ObjectlnputStream и ObjectOutputStream проверяют, существуют ли такие методы в классе сериализуемого объекте. Если да,
то они вызываются вместо defaultWriteObject() и defaultReadObject().
Интерфейс Externalizable
Интерфейс является интерфейсом, производным от java.io.Serializable: public interface Externalizable extends Serializable
и используется вместо Serializable.
Интерфейс java.io.Externalizable объявляет методы readExternal() и writeExternal(): public abstract void writeExternal (ObjectOutput out)
throws IOException;
public abstract void readExternal (Objectlnput in) throws IOException, ClassNotFoundException.
Входной и выходной объектный поток используют их вместо readObject() или writeObject() соответственно.
Метод writeExternal() записывает состояние объекта в ObjectOutput, передавая объект в качестве параметра. Метод readExternal() считывает состояние объекта из Objectlnput, передавая объект в качестве параметра, и восстанавливает это состояние объекта.
Объекты типа Externalizable ответственны за сохранение и восстановление не только своего собственного состояния, но и любого актуального состояния в их суперклассе. Сериализуемые объекты обрабатывают состояние суперкласса автоматически; externalizable-объекты такой возможности не имеют.
Создание экземпляров сериализованных Bean
Технология JavaBeans позволяет настроить компонент, т.е. указать его свойства в среде визуального проектирования, а затем сохранить их значения в файле с расширением .ser для последующего использования в составе некоторой программы. При этом в программе для создания экземпляра сериализованного Bean следует использовать не оператор new. Используется статический метод instantiate(), который определён в классе java.beans.Beans:
public static Object instantiate(ClassLoader cl, String beanName) throws IOExceptipn, ClassNotFoundException
Этот метод создает экземпляр Bean. Квалифицированное имя класса (либо имя файла сериализованного компонента) задаётся параметром beanName. Загрузчик класса указывается в параметре cl. Если ссылка cl равна null, то по умолчанию применяется системный загрузчик класса.
51