Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программирование на Java часть 2

.pdf
Скачиваний:
134
Добавлен:
16.03.2016
Размер:
3.07 Mб
Скачать

synchronized static Calendar getInstance() - возвращает объект класса

Calendar для региональных данных и часового пояса по умолчанию. Есть и другие перегруженные версии.

final Date getTime() - возвращает объекта класса Date, содержащий время, эквивалентное вызывающему объекту

TimeZone getTimeZone() - возвращает часовой пояс

final boolean isSet(int field) - возвращает значение true, если указанный компонент времени указан.

void set(int field, int value) - устанавливает компоненты даты или времени. Есть перегруженные версии

final void setTime(Date date) - устанавливает различные компоненты даты и времени через объект класса Date

void setTimeZone(TimeZone timezone) - устанавливает часовой пояс через объект класса TimeZone

Получить дату можно с помощью метода getTime(). Он вернѐт нам объект класса Date, в котором будут храниться значения времени, в которое был вызван Calendar.getInstance(). Кроме даты целиком, можно также получить различные части даты, воспользовавшись константами класса Calendar и его методом get. Вот список этих констант:

Calendar.DATE — получим дату

Calendar.ERA — возвращает эру (до нашей эры или после)

Calendar.YEAR — получим значение года

Calendar.MONTH — get() возвратит число, равное номеру месяца

Calendar.HOUR — часы

Calendar.MINUTE — минуты

Calendar.SECOND — секунды

Calendar.MILLISECOND — миллисекунды

Calendar.DAY_OF_YEAR — возвратит день в году

Calendar.DAY_OF_MONTH — день месяца

Calendar.DAY_OF_WEEK — порядковый номер дня в неделе

Calendar.DAY_OF_WEEK_IN_MONTH — порядковый номер дня недели в текущем месяце

Calendar.WEEK_OF_MONTH — номер недели в месяце

Calendar.WEEK_OF_YEAR — номер недели в году

Calendar.AM_PM — индикатор до обеда/после обеда

Приведем пример использования этих констант

Calendar calendar = Calendar.getInstance(); System.out.println("DATE: " + calendar.getTime()); System.out.println("ERA: " + calendar.get(Calendar.ERA)); System.out.println("YEAR: " + calendar.get(Calendar.YEAR));

System.out.println("MONTH: " + calendar.get(Calendar.MONTH));

101

System.out.println("HOUR: " + calendar.get(Calendar.HOUR)); System.out.println("MINUTE: " + calendar.get(Calendar.MINUTE)); System.out.println("SECOND: " + calendar.get(Calendar.SECOND)); System.out.println("MILLISECOND:"+calendar.get(Calendar.MILLISE

COND));

System.out.println("DAY_OF_YEAR:"+calendar.get(Calendar.DAY_O F_YEAR));

System.out.println("DAY_OF_MONTH:"+calendar.get(Calendar.DAY_ OF_MONTH));

System.out.println("DAY_OF_WEEK:"+calendar.get(Calendar.DAY_O F_WEEK));

System.out.println("DAY_OF_WEEK_IN_MONTH:"+calendar.get(Cal endar.DAY_OF_WEEK_IN_MONTH));

System.out.println("WEEK_OF_MONTH:"+calendar.get(Calendar.WE EK_OF_MONTH));

System.out.println("WEEK_OF_YEAR:"+calendar.get(Calendar.WEEK _OF_YEAR));

System.out.println("AM_PM: " + calendar.get(Calendar.AM_PM));

Также в календаре определены много различных констант: AUGUST и другие месяцы, SATURDAY и другие дни недели, HOUR и т.д.

3.10.3 GregorianCalendar

Класс GregorianCalendar является подклассом Calendar, который представляет обычный Григорианский календарь. Метод getInstance() класса Calendar обычно возвращает объект класса GregorianCalendar, инициированный текущей датой и временем согласно региональным настройкам.

У класса есть два поля AD и BC - до нашей эры и наша эра. Кроме стандартных методов, которые есть в классе Calendar, у GregorianCalendar есть метод isLeapYear() для проверки високосного года.

boolean isLeapYear(int year)

Если год високосный, то возвращается true.

Отсчѐт месяцев идѐт от нуля, поэтому декабрь будет одиннадцатым месяцем. Чтобы не путаться с такими случаями, проще использовать понятные константы:

GregorianCalendar calendar = new GregorianCalendar(1975,

Calendar.DECEMBER, 31);

102

А получать нужные отрезки времени можно через метод get(). Например, узнать, какой месяц содержится в созданной нами дате можно так:

int month = calendar.get(Calendar.MONTH); System.out.println(month); // вернѐт 11

Изменить состояние объекта можно через метод set(). Например, установим новую дату у нашего объекта.

GregorianCalendar calendar = new GregorianCalendar(1975, Calendar.DECEMBER, 31);

calendar.set(1976, Calendar.FEBRUARY, 23); // Убедимся, что возвращает 1 - февраль

System.out.println(calendar.get(Calendar.MONTH));

Можно сдвинуть дату на определѐнный период с помощью метода add(). Отодвинем дату на два месяца.

GregorianCalendar calendar = new GregorianCalendar(1975, Calendar.DECEMBER, 31);

calendar.add(Calendar.MONTH, 2); System.out.println(calendar.get(Calendar.MONTH));

Методы getTime() и setTime() работают с объектами Date и полезны для преобразования.

GregorianCalendar calendar = new GregorianCalendar(year, month, day); Date hireDay = calendar.getTime();

3.10.4 TimeZone,SimpleTimeZone

Класс TimeZone позволяет работать с часовыми поясами, смещѐнными относительно Гринвича, также известного универсальное глобальное время (UTC). Класс также учитывает летнее время.

Класс SimpleTimeZone - подкласс класса TimeZone и позволяет работать с часовыми поясами в Григорианском календаре.

3.10.5 Класс DateFormat, SimpleDateFormat

Класс DateFormat является абстрактным классом, с помощью которого можно форматировать и анализировать показания даты и времени. метод getDateInstance() возвращает экземпляр класса DateFormat, который может форматировать информацию о дате.

103

Чаще всего используется метод format(), позволяющий вывести дату в нужном формате.

Класс SimpleDateFormat является подклассом класса DateFormat и позволяет определять собственные шаблоны форматирования для отображения даты и времени.

Приведем простой пример форматирования даты с использованием класса SimpleDateFormat:

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy.MM.dd G 'at' HH:mm:ss z");

System.out.println("date: " + dateFormat.format( new Date() ) );

Если на компьютере локализацией по умолчанию является русская локализация, то в результате выполнения приведенного кода Вы увидите следующее:

date: 2012.02.07 н.э. at 15:13:08 EET

Рассмотрим некоторые методы класса SimpleDateFormat. Для начала, у класса есть 4 конструктора:

SimpleDateFormat()

//Создает SimpleDateFormat, используя паттерн времени и формат символов по умолчанию для текущей локализации

SimpleDateFormat(String pattern)

//Создает SimpleDateFormat, используя заданный паттерн времени и формат символов по умолчанию для текущей локализации

SimpleDateFormat(String pattern, DateFormatSymbols formatSymbols)

//Создает SimpleDateFormat, используя заданные паттерн времени и формат символов

SimpleDateFormat(String pattern, Locale locale)

//Создает SimpleDateFormat, используя заданный паттерн времени и формат символов по умолчанию для заданной локализации

Следующий пример демонстрирует работу всех четырех конструкторов:

package simpledateformatexample;

import java.text.DateFormatSymbols; import java.text.SimpleDateFormat; import java.util.Date;

import java.util.Locale;

public class SimpleDateFormatExample {

104

public static void main(String[] args) { Date currentDate = new Date(); SimpleDateFormat dateFormat = null; dateFormat = new SimpleDateFormat();

System.out.println("Constructor 1: " + dateFormat.format( currentDate ) ); dateFormat = new SimpleDateFormat("dd MMMM"); System.out.println("Constructor 2: " + dateFormat.format( currentDate ) ); dateFormat = new SimpleDateFormat("dd MMMM", myDateFormatSymbols

);

System.out.println("Constructor 3: " + dateFormat.format( currentDate ) ); dateFormat = new SimpleDateFormat("dd MMMM", Locale.ENGLISH); System.out.println("Constructor 4: " + dateFormat.format( currentDate ) );

}

private static DateFormatSymbols myDateFormatSymbols = new DateFormatSymbols(){

@Override

public String[] getMonths() {

return new String[]{"января", "февраля", "марта", "апреля", "мая",

"июня",

"июля", "августа", "сентября", "октября", "ноября", "декабря"};

}

};

}

Результатом выполнения этого кода будут следующие четыре строки:

Constructor 1: 07.02.12 15:34

Constructor 2: 07 Февраль

Constructor 3: 07 февраля

Constructor 4: 07 February

Конструктор по умолчанию использует паттерн времени и формат символов по умолчанию для текущей локализации. То есть, для русской локализации стандартным паттерном времени является паттерн "dd.MM.yy

HH:mm".

Конструктор SimpleDateFormat(String pattern) принимает паттерн даты, в котором будет отдавать результат метод format(). В примере мы использовали паттерн "dd MMMM", который требует от format() вывести дату в следующем формате: "две цифры дня месяца" + "пробел" + "название месяца". В данном случае используется название месяца по умолчанию для текущей локализации, т.е., "Февраль".

105

Конструктор SimpleDateFormat("dd MMMM", myDateFormatSymbols )

аналогичен предыдущему за исключением того, что название месяца используется не по умолчанию, а те, которые возвращает переменная myDateFormatSymbols. В свою очередь, в переменной myDateFormatSymbols

мы переопределили метод getMonths() чтобы он возвращал названия месяцев с прописной буквы и в родительном падеже.

Конструктор SimpleDateFormat("dd MMMM", Locale.ENGLISH)

аналогичен конструктору SimpleDateFormat(String pattern), но использует заданную локализацию. В нашем случае это английская локализация

Locale.ENGLISH.

Рассмотрим подробно параметры, принимаемые классом SimpleDateFormat в качестве паттерна даты.

Символ Что означает

G

 

эра (в английской локализации - AD и BC)

 

 

 

y

 

год (4-х значное число)

 

 

 

 

 

 

yy

 

год (последние 2 цифры)

 

 

 

yyyy

 

год (4-х значное число)

 

 

 

M

 

номер месяца без лидирующих нулей

MMномер месяца (с лидирующими нулями если номер месяца < 10)

MMMчетырех буквенное сокращение месяца в русской локализации и трех буквенное - в английской (Feb)

MMMMполное название месяца (в английской локализации - February)

w

 

неделя в году без лидирующих нулей

 

 

 

 

 

 

ww

 

неделя в году с лидирующими нулями

 

 

 

W

 

неделя в месяце без лидирующих нулей

WWнеделя в месяце с лидирующим нулем (если это необходимо)

D

 

день в году

 

 

 

d

 

день месяца без лидирующих нулей

 

 

 

dd

 

день месяца с лидирующими нулями

 

 

 

F

 

день недели в месяце без лидирующих нулей

 

 

 

FF

 

день недели в месяце с лидирующими нулями

 

 

 

 

 

 

E

 

день недели (сокращение)

 

 

 

EEEE

 

день недели (полностью)

 

 

 

a

 

AM/PM указатель

 

106

Пример

н.э.

2012

12

2012

2

02

фев

Февраль

7

07

2

02

38

7

07

1

01

Вт

вторник

AM

H

 

часы в 24-часовом формате без лидирующих нулей

 

6

 

 

 

 

HH

 

часы в 24-часовом формате с лидирующим нулем

 

06

 

 

 

 

k

 

количество часов в 24-часовом формате

 

18

 

 

 

 

 

 

 

 

 

K

 

количество часов в 12-часовом формате

 

6

 

 

 

 

h

 

время в 12-часовом формате без лидирующих нулей

 

6

 

 

 

 

hh

 

время в 12-часовом формате с лидирующим нулем

 

06

 

 

 

 

m

 

минуты без лидирующих нулей

 

32

 

 

 

 

 

 

 

 

 

mm

 

минуты с лидирующим нулем

 

32

 

 

 

 

s

 

секунды без лидирующих нулей

 

11

 

 

 

 

 

 

 

 

 

ss

 

секунды с лидирующим нулем

 

11

 

 

 

 

S

 

миллисекунды

 

109

 

 

 

 

 

z

 

часовой пояс

 

EET

 

 

 

 

Z

 

часовой пояс в формате RFC 822

 

+0200

 

 

 

 

 

 

 

 

 

 

'

 

символ экранирования для текста

 

'Date='

 

 

 

 

 

''

 

кавычка

 

'o''clock'

Рассмотрим несколько примеров паттернов даты и времени, которые представлены в официальной документации. Русская локализация:

Паттерн даты и времени

"e;yyyy.MM.dd G 'at' HH:mm:ss z"e;

"e;EEE, MMM d, ''yy"e;

"e;h:mm a"e;

"e;hh 'o''clock' a, zzzz"e;

"e;K:mm a, z"e;

"e;yyyyy.MMMMM.dd GGG hh:mm aaa"e;

"e;EEE, d MMM yyyy HH:mm:ss Z"e;

"e;yyMMddHHmmssZ"e;

Английская локализация:

Результат

2012.02.07 н.э. at 16:51:35 EET

Вт, фев 7, '12

4:51 PM

04 o'clock PM, Eastern European Time

4:51 PM, EET

02012.Февраль.07 н.э. 04:51 PM

Вт, 7 фев 2012 16:51:35 +0200 120207165135+0200

Паттерн даты и времени

 

 

Результат

 

 

 

 

"e;yyyy.MM.dd G 'at' HH:mm:ss z"e;

 

 

2012.02.07 AD at 16:55:57 EET

 

 

 

 

"e;EEE, MMM d, ''yy"e;

 

 

Tue, Feb 7, '12

 

 

 

 

"e;h:mm a"e;

 

 

4:55 PM

 

 

 

 

"e;hh 'o''clock' a, zzzz"e;

 

 

04 o'clock PM, Eastern European

 

107

 

 

Time

 

 

 

"e;K:mm a, z"e;

 

4:55 PM, EET

 

 

 

"e;yyyyy.MMMMM.dd GGG hh:mm

 

02012.February.07 AD 04:55 PM

aaa"e;

 

 

 

 

 

 

"e;EEE, d MMM yyyy HH:mm:ss Z"e;

 

Tue, 7 Feb 2012 16:55:57 +0200

 

 

"e;yyMMddHHmmssZ"e;

 

120207165557+0200

 

 

 

Тема 3.11 Рефлексия

Рефлексия (от позднелат. reflexio - обращение назад) - это механизм исследования данных о программе во время еѐ выполнения. Рефлексия позволяет исследовать информацию о полях, методах и конструкторах классов. Можно также выполнять операции над полями и методами которые исследуются. Рефлексия в Java осуществляется с помощью Java Reflection API. Этот интерфейс API состоит из классов пакетов java.lang и java.lang.reflect. С помощью интерфейса Java Reflection API можно делать следующее:

Определить класс объекта.

Получить информацию о модификаторах класса, полях, методах, конструкторах и суперклассах.

Выяснить, какие константы и методы принадлежат интерфейсу.

Создать экземпляр класса, имя которого неизвестно до момента выполнения программы.

Получить и установить значение свойства объекта.

Вызвать метод объекта.

Создать новый массив, размер и тип компонентов которого неизвестны до момента выполнения программ.

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

MyClass a = new MyClass(); Class aclass = a.getClass();

Самое простое, что обычно делается в динамическом программировании, - это получают объект типа java.lang.Class. Если у нас есть экземпляр объекта Class мы можем получить всевозможную информацию об этом классе и даже осуществлять операции над ним. Вышеприведенный метод getClass() часто полезен тогда когда есть экземпляр объекта, но не известно какого класса этот экземпляр. Если у нас есть класс, для которого в момент компиляции известен тип, то получить экземпляр класса ещѐ проще.

108

Class aclass = MyClass.class; Class iclass = Integer.class;

Если имя класса не известно в момент компиляции, но становится известным во время выполнения программы, можно использовать метод forName(), чтобы получить объект Class.

Class c = Class.forName("com.mysql.jdbc.Driver");

3.11.2 Получение имени класса

Class c = myObject.getClass();

String s = c.getName();

Объект типа String, возвращаемый методом getName(), будет содержать полностью уточненное имя класса, т.е. если типом объекта myObject будет

Integer, то результат будет вида java.lang.Integer .

3.11.3 Исследование модификаторов класса

Class c = obj.getClass(); int mods = c.getModifiers();

if (Modifier.isPublic(mods)) { System.out.println("public");

}

if (Modifier.isAbstract(mods)) { System.out.println("abstract");

}

if (Modifier.isFinal(mods)) { System.out.println("final");

}

Чтобы узнать, какие модификаторы были применены к заданному классу, сначала нужно с помощью метода getClass получить объект типа Class, представляющий данный класс. Затем нужно вызвать метод getModifiers() для объекта типа Class, чтобы определить значение типа int, биты которого представляют модификаторы класса. После этого можно использовать статические методы класса java.lang.reflect.Modifier, чтобы определить, какие именно модификаторы были применены к классу.

3.11.4 Нахождение суперклассов

Class c = myObj.getClass();

Class superclass = c.getSuperclass();

109

Можно также использовать метод getSuperclass() для объекта Class, чтобы получить объект типа Class, представляющий суперкласс рефлексированного класса. Нужно не забывать учитывать, что в Java отсутствует множественное наследование и класс java.lang.Object является базовым классом для всех классов, вследствие чего если у класса нет родителя то метод getSuperclass вернет null. Для того чтобы получить все родительские суперклассы, нужно рекурсивно вызывать метод getSuperclass().

3.11.5 Определение интерфейсов, реализуемых классом

Class c = LinkedList.class;

Class[] interfaces = c.getInterfaces(); for(Class cInterface : interfaces) {

System.out.println( cInterface.getName() );

}

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

3.11.6 Исследование, получение и установка значений полей класса.

Class c = obj.getClass();

Field[] publicFields = c.getFields(); for (Field field : publicFields) {

Class fieldType = field.getType(); System.out.println("Имя: " + field.getName()); System.out.println("Тип: " + fieldType.getName());

}

Чтобы исследовать поля принадлежащие классу, можно воспользоваться методом getFields() для объекта типа Class. Метод getFields() возвращает массив объектов типа java.lang.reflect.Field, соответствующих всем открытым полям объекта. Эти открытые поля необязательно должны содержаться непосредственно внутри класса, с которым вы работаете, они также могут содержатся в суперклассе, интерфейсе или интерфейсе представляющем собой расширение интерфейса, реализованного классом. С помощью класса Field можно получить имя поля, тип и модификаторы. Если известно имя поля, то можно получить о нем информацию с помощью метода getField()

Class c = obj.getClass();

Field nameField = c.getField("name");

110