Содержание
- 2. Подготовка класса к использованию Процесс подготовки класса к использованию имеет три стадии загрузка; получение байт-кода, реализующего
- 3. 3. инициализация; инициализация базового класса (с его предварительной загрузкой и связыванием, если это необходимо) и вычисление
- 4. protected final void resolveClass(Class с) Связывает класс, если тот еще не связан. Виртуальная машина, приступая к
- 5. Загрузка дополнительных ресурсов Классы являются основными ресурсами, в которых нуждается программа, но некоторым классам необходимы также
- 6. Системные ресурсы связаны с системными классами, а таковые могут не обладать загрузчиками. Статический метод getSystemResourceAsStream возвращает
- 7. Например, для класса PlayerLoader (определенного в предыдущей лекции) имеем: public InputStream getResourceAsStream(String name){ try{ return streamFor(name);
- 8. Существуют также методы: public Enumeration findResources(String name) Возвращает объект Enumeration, который позволяет просматривать объекты URL для
- 9. Аннотации в Java Аннотации представляют собой некие метаданные, которые могут добавляться в исходный код программы и
- 10. Аннотации могут быть применены, например, к декларациям классов, полей, методов, и других аннотаций. Для описания новой
- 11. @Description(title="title", version=2, text="text") public class Clazz { /* */ } В качестве типов у элементов аннотации
- 12. RetentionPolicy.SOURCE - аннотация используется на этапе компиляции и должна отбрасываться компилятором; RetentionPolicy.CLASS - аннотация будет записана
- 13. По умолчанию у всех аннотаций стоит RetentionPolicy.CLASS. Рассмотрим пример аннотации. Предположим, необходимо ограничить доступ к некоторым
- 14. public class User { public static enum Permission { USER_MANAGEMENT, CONTENT_MANAGEMENT } private List permissions; public
- 15. @Retention(RetentionPolicy.RUNTIME) public @interface PermissionRequired { User.Permission value(); } Предположим имеется некоторое действие, право на выполнение которого
- 16. Теперь используя reflection можно принимать решение, разрешать или не разрешать выполнение определенного действия: User user =
- 17. Рассмотрим другой пример: import java.lang.annotation.*; import java.lang.reflect.Method; enum Condition {TRUE, FALSE } @Retention(RetentionPolicy.RUNTIME) @interface Cond {
- 18. Пример. Аннотация у метода. Аннотация RequestForCustomer сопровождает объявление метода ………………………………….. @RequestForCustomer ( level = 2, description
- 19. import java.lang.reflect.Method; public class Request { @RequestForCustomer (level = 2, description = "Enabletime", date = "10/10/2007“
- 20. Сериализация Сериализация это процесс сохранения состояния объекта в последовательность байт; десериализация это процесс восстановления объекта, из
- 21. Сериализация объектов в Java Класс сериализуемого объекта должен реализовать интерфейс java.io.Serializable: import java.io.Serializable; сlass TestSerial implements
- 22. Сериализация делается вызовом метода writeObject() класса java.io.ObjectOutputStream Рассмотрим пример: public static void main(String args[]) throws IOException
- 23. Воссоздать объект из файла можно следующим образом: public static void main(String args[]) throws IOException,ClassNotFoundException { FileInputStream
- 24. Восстановление объекта происходит с помощью вызова метода oin.readObject(). В методе происходит чтение набора байт из файла
- 25. Кроме того, требуется, чтобы класс, базовый по отношению к рассматриваемому, либо обладал конструктором без параметров (дабы
- 26. public class Name implements Serializable { private String name; private long id; private transient boolean hashSet
- 27. Объект класса Name может быть сохранен в потоке ObjectOutputStream и непосредственно, с помощью вызова метода writeObject,
- 28. Схема десериализации, предлагаемая по умолчанию, предусматривает считывание из потока байтовых данных, сохраненных в процессе сериализации. Статические
- 29. Каждому полю transient в восстановленном объекте присваивается значение по умолчанию, соответствующее типу этого поля. При десериализации
- 30. Любая попытка осуществления сериализации объекта, не поддерживающего эту возможность, приводит к выбрасыванию исключения типа NotSerializableException. Порядок
- 32. Рассмотрим порядок десериализации для объекта HTTPInput. Поток ObjectlnputStream вначале выделяет память для нового объекта, а затем
- 33. Примечание. Если должно быть сохранено иное состояние части объекта, относящейся к базовому классу (InputSource), ответственность за
- 34. 3. После того, как ближайший из классов, поддерживающих механизм сериализации, завершает восстановление данных того подмножества полей,
- 35. Если в ходе десериализации объекта будут найдены ссылки на другие ранее сериализованные объекты. Эти объекты подвергаются
- 36. Прежде чем будут выполнены любые из рассмотренных операций десериализации, соответствующие классы должны быть загружены, в противном
- 37. Настройка механизма сериализации Для некоторых классов обычные средства десериализации могут оказаться неадекватными или неэффективными. В этом
- 38. В качестве примера рассмотрим улучшенный вариант класса Name public class BetterName implements Serializable { private String
- 39. private void writeObject(ObjectOutputStream out) throws lOException { out.writeUTF(name); out.writeLong(id); } private void readObject(ObjectlnputStream in) throws lOException,
- 40. Существует ограничение: приступая к настройке механизма сериализации, нельзя присваивать значение полю final в теле метода readObject,
- 41. Контроль версий объектов Если реализация классов может быть изменена в промежутке времени между сериализацией и десериализацией
- 42. По умолчанию идентификатор создается в виде хеш-кода, построенного на основе информации об именах класса, его членов
- 43. Если требуемый класс не найден или идентификатор загруженного класса не совпадает с тем, который считан из
- 44. Рассмотрим пример. Пусть изначально имеется класс public class BetterName implements Serializable { private String name; private
- 45. Используя следущий код сереализируем данный класс public static void main(String args[])throws IOException{ FileOutputStream fos = new
- 46. Предположим, что перед десериализацией код класса BetterName был изменен public class BetterName implements Serializable { private
- 47. Если данный класс десериализировать с помощью кода public static void main(String args[]) throws IOException,ClassNotFoundException{ FileInputStream fis
- 48. Чтобы избежать выброса исключения необходимо добавить в код класса BetterName поле serialversionUlD public class BetterName implements
- 49. Получить значение поля serialVersionUID можно с помощью утилиты serialver, она находится там же, где и javac:
- 50. Интерфейс Externalizable Интерфейс Externalizable является производным от Serializable. Класс, реализующий интерфейс Externalizable, приобретает все полномочия по
- 51. Подобная возможность необходима, например, в условиях, когда при реализации хранилища данных об объектах следует учесть некие
- 52. Методы вызываются в процессе сериализации и десериализации объекта соответственно. Это обычные методы public, и выбор требуемой
- 53. Рассмотрим пример: import java.io.Externalizable; import java.io.ObjectOutput; import java.io.IOException; import java.io.ObjectInput; public class ItemExt implements Externalizable{ private
- 54. public ItemExt(int fieldInt, boolean fieldBoolean, long fieldLong, float fieldFloat, double fieldDouble, String fieldString) { this.fieldInt =
- 55. public int getFieldInt() { return fieldInt; } public boolean getFieldBoolean() { return fieldBoolean; } public long
- 56. public void writeExternal(ObjectOutput out) throws IOException{ out.writeInt(fieldInt); out.writeBoolean(fieldBoolean); out.writeLong(fieldLong); out.writeFloat(fieldFloat); out.writeDouble(fieldDouble); out.writeUTF(fieldString); }
- 57. public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException{ fieldInt = in.readInt(); fieldBoolean = in.readBoolean(); fieldLong = in.readLong();
- 58. Тогда сериализация класса ItemExt будет иметь вид: public static void main(String[] args)throws IOException{ FileOutputStream fos =
- 60. Скачать презентацию