<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Блог о Java технологиях &#187; Java</title>
	<atom:link href="http://java.in.ua/category/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://java.in.ua</link>
	<description></description>
	<lastBuildDate>Tue, 19 Jul 2011 12:39:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Ордена и медали в ИТ: Подготовка к SCJP. Часть 1</title>
		<link>http://java.in.ua/2011/03/10/%d0%be%d1%80%d0%b4%d0%b5%d0%bd%d0%b0-%d0%b8-%d0%bc%d0%b5%d0%b4%d0%b0%d0%bb%d0%b8-%d0%b2-%d0%b8%d1%82-%d0%bf%d0%be%d0%b4%d0%b3%d0%be%d1%82%d0%be%d0%b2%d0%ba%d0%b0-%d0%ba-scjp-%d1%87%d0%b0%d1%81%d1%82/</link>
		<comments>http://java.in.ua/2011/03/10/%d0%be%d1%80%d0%b4%d0%b5%d0%bd%d0%b0-%d0%b8-%d0%bc%d0%b5%d0%b4%d0%b0%d0%bb%d0%b8-%d0%b2-%d0%b8%d1%82-%d0%bf%d0%be%d0%b4%d0%b3%d0%be%d1%82%d0%be%d0%b2%d0%ba%d0%b0-%d0%ba-scjp-%d1%87%d0%b0%d1%81%d1%82/#comments</comments>
		<pubDate>Thu, 10 Mar 2011 16:19:15 +0000</pubDate>
		<dc:creator>Evgenij Nerush</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[SCJP]]></category>

		<guid isPermaLink="false">http://java.in.ua/?p=1120</guid>
		<description><![CDATA[Как сказал мой глубокоуважаемый коллега, существует два основных пути подготовки к SCJP: будучи неопытными девелоперами мы усердно читаем литературу по сдаче SCJP и ничего не понимаем, колбасим тесты, сдаем и забываем нахрен все ньюансы в течении ближайших двух-трех дней, без которых сдать SCJP было бы не реально идем годами по тернистому пути улучшения порожденного нами [...]]]></description>
			<content:encoded><![CDATA[<p>Как сказал мой глубокоуважаемый коллега, существует два основных пути подготовки к SCJP:</p>
<ul>
<li>будучи неопытными девелоперами мы усердно читаем литературу по сдаче SCJP и ничего не понимаем, <strong>колбасим</strong> тесты, сдаем и забываем нахрен все ньюансы в течении ближайших двух-трех дней, без которых сдать SCJP было бы не реально</li>
<li>идем годами по тернистому пути улучшения порожденного нами в прошлом говнокода и в конечном итоге вдумчиво читаем литературу по сдаче SCJP. Хочу заметить, что с каждой прочитанной страницей ты все чаще подсчитываешь количество оставшихся страниц, одновременно <strong>колбасишь </strong>тесты и ищешь мотиватор для достижения поставленой цели. Сдаешь тесты и нахрен все забываешь через неделю-две.</li>
</ul>
<p>Лично я иду по второму пути, и, прочитав 1/3 от запланированного, уже начинаю искать мотиватор.</p>
<p>А как было у вас, дорогой читатель? По какому пути пошли вы? И как быстро вы забыли нахрен те ньюансы, над которыми пыхтели днями и ночами?</p>
<div><script type="text/javascript" src="http://odnaknopka.ru/wp/ok2.utf8.js"></script><script type="text/javascript">okbm("http://java.in.ua/2011/03/10/%d0%be%d1%80%d0%b4%d0%b5%d0%bd%d0%b0-%d0%b8-%d0%bc%d0%b5%d0%b4%d0%b0%d0%bb%d0%b8-%d0%b2-%d0%b8%d1%82-%d0%bf%d0%be%d0%b4%d0%b3%d0%be%d1%82%d0%be%d0%b2%d0%ba%d0%b0-%d0%ba-scjp-%d1%87%d0%b0%d1%81%d1%82/","Ордена и медали в ИТ: Подготовка к SCJP. Часть 1")</script></div>]]></content:encoded>
			<wfw:commentRss>http://java.in.ua/2011/03/10/%d0%be%d1%80%d0%b4%d0%b5%d0%bd%d0%b0-%d0%b8-%d0%bc%d0%b5%d0%b4%d0%b0%d0%bb%d0%b8-%d0%b2-%d0%b8%d1%82-%d0%bf%d0%be%d0%b4%d0%b3%d0%be%d1%82%d0%be%d0%b2%d0%ba%d0%b0-%d0%ba-scjp-%d1%87%d0%b0%d1%81%d1%82/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Advanced Topics in Programming Languages: The Java Memory&#8230;</title>
		<link>http://java.in.ua/2010/08/04/advanced-topics-in-programming-languages-the-java-memory/</link>
		<comments>http://java.in.ua/2010/08/04/advanced-topics-in-programming-languages-the-java-memory/#comments</comments>
		<pubDate>Wed, 04 Aug 2010 17:37:19 +0000</pubDate>
		<dc:creator>Evgenij Nerush</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[concurrency]]></category>

		<guid isPermaLink="false">http://java.in.ua/?p=1018</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p><object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/1FX4zco0ziY&amp;hl=en_US&amp;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/1FX4zco0ziY&amp;hl=en_US&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object></p>
<div><script type="text/javascript" src="http://odnaknopka.ru/wp/ok2.utf8.js"></script><script type="text/javascript">okbm("http://java.in.ua/2010/08/04/advanced-topics-in-programming-languages-the-java-memory/","Advanced Topics in Programming Languages: The Java Memory&amp;#8230;")</script></div>]]></content:encoded>
			<wfw:commentRss>http://java.in.ua/2010/08/04/advanced-topics-in-programming-languages-the-java-memory/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Алгоритм сериализации объектов в Java</title>
		<link>http://java.in.ua/2009/06/11/java_serialization_algorithm/</link>
		<comments>http://java.in.ua/2009/06/11/java_serialization_algorithm/#comments</comments>
		<pubDate>Thu, 11 Jun 2009 11:26:35 +0000</pubDate>
		<dc:creator>Evgenij Nerush</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[JPA]]></category>
		<category><![CDATA[Serialization]]></category>

		<guid isPermaLink="false">http://java.in.ua/?p=733</guid>
		<description><![CDATA[Сериализацией (Serialization) называют процесс сохранения состояния объекта в последовательность байт, в то время как десериализацией называют обратный процесс, формирующий объект из последовательности байт. Java Serialization API предоставляет разработчикам механизм, позволяющий производить сериализацию/десериализацию объектов. В этой статье вы узнаете, как сериализовать объект, и когда сериализация является необходимой. Вы так же узнаете, как работает алгоритм сериализации в [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-medium wp-image-370" title="java_starting" src="http://java.in.ua/wp-content/uploads/2008/12/java_starting-300x300.jpg" alt="" width="144" height="144" />Сериализацией (<a title="http://java.sun.com/j2se/1.4/pdf/serial-spec.pdf" href="http://en.wikipedia.org/wiki/Serialization" target="_blank">Serialization</a>) называют процесс сохранения состояния объекта в последовательность байт, в то время как десериализацией называют обратный процесс, формирующий объект из последовательности байт. <a href="http://java.sun.com/developer/technicalArticles/Programming/serialization/" target="_blank">Java Serialization API</a> предоставляет разработчикам механизм, позволяющий производить сериализацию/десериализацию объектов. В этой статье вы узнаете, как сериализовать объект, и когда сериализация является необходимой. Вы так же узнаете, как работает алгоритм сериализации в Java на примере, иллюстрирующем формат сериализации объектов на низком уровне.</p>
<p><strong>Итак, зачем нужна сериализация?</strong></p>
<p>На сегодняшний день, традиционное приложение уровня предприятия состоит из разнообразных компонентов и распределено между различными системами и сетями. В Java всё представлено в качестве объектов (за исключением примитивных типов); для того, чтобы два объекта могли взаимодействовать между собой, должен существовать механизм, позволяющий обмениваться данными. Одним из путей достижения такого взаимодействия может служить разработка протокола обмена объектами. В этом случае получатель объекта должен работать по такому же протоколу, по которому работает отправитель объекта, что в свою очередь может привести к затруднениям при интеграции ваших компонентов со сторонними компонентами. Из этого следует, что протокол должен быть простым и обобщённым, что в свою очередь в Java достигается с помощью сериализации.<span id="more-733"></span></p>
<p>Рисунок 1 иллюстрирует взаимодействие &#8220;клиент/сервер&#8221;, в котором объект передаётся от клиента к серверу через сериализацию.</p>
<p><img class="aligncenter size-full wp-image-806" title="jtip050709-fig1" src="http://java.in.ua/wp-content/uploads/2009/06/jtip050709-fig1.gif" alt="" width="500" height="223" /></p>
<p><strong>Рисунок 1. Сериализация в действии</strong></p>
<p><strong>Как сериализовать объект</strong></p>
<p>Для того, чтобы объект был сериализуемым, класс этого объекта должен реализовывать интерфейс  java.io.Serializable. Листинг 1 демонстрирует пример реализации данного интерфейса.</p>
<p><strong>Листинг 1. Реализация интерфейса java.io.Serializable</strong></p>
<pre class="brush: java; title: ; notranslate">import java.io.Serializable;

class TestSerial implements Serializable {
    public byte version = 100;
    public byte count = 0;
}</pre>
<p>Интерфейс java.io.Serializable не содержит методов и является маркером, который говорит механизму сериализации о том, что объект, реализующий данный интерфейс, может быть сериализован.</p>
<p>Теперь, когда у нас уже есть класс, реализующий интерфейс java.io.Serializable, следующим шагом станет написание алгоритма, ответственного за сериализацию экземпляра класса TestSerial, что приведено в Листинге 2.</p>
<p><strong>Листинг 2. Реализация алгоритма сериализации</strong></p>
<pre class="brush: java; title: ; notranslate">public static void main(String args[]) throws IOException {
    FileOutputStream fos = new FileOutputStream(&quot;temp.out&quot;);
    ObjectOutputStream oos = new ObjectOutputStream(fos);
    TestSerial ts = new TestSerial();
    oos.writeObject(ts);
    oos.flush();
    oos.close();
}</pre>
<p>Код, приведённый в Листинге 2, сериализует состояние экземпляра класса TestSerial в файл temp.out. Для воссоздания объекта, нужно произвести десериализацию, как показано в Листинге 3.</p>
<p><strong>Листинг 3. Воссоздание сериализованного объекта</strong></p>
<pre class="brush: java; title: ; notranslate">public static void main(String args[]) throws IOException {
    FileInputStream fis = new FileInputStream(&quot;temp.out&quot;);
    ObjectInputStream oin = new ObjectInputStream(fis);
    TestSerial ts = (TestSerial) oin.readObject();
    System.out.println(&quot;version=&quot;+ts.version);
}</pre>
<p>В Листинге 3, восстановление объекта осуществляется с помощью вызова oin.readObject() метода. Так как этот метод может считывать любой сериализуемый объект, приведение объекта к определённому классу является обязательным. При выполнении данного кода на экран будет выведено сообщение &#8220;<code>version=100</code>&#8220;.</p>
<p><strong>Формат сериализации объекта</strong></p>
<p>Прежде всего, давайте рассмотрим содержимое файла temp.out в шестнадцатиричном формате, приведённое в Листинге 4.</p>
<p><strong>Листинг 4. Представление сериализуемого объекта в шестнадцатиричном формате<br />
</strong></p>
<pre class="brush: java; title: ; notranslate">AC ED 00 05 73 72 00 0A 53 65 72 69 61 6C 54 65
73 74 A0 0C 34 00 FE B1 DD F9 02 00 02 42 00 05
63 6F 75 6E 74 42 00 07 76 65 72 73 69 6F 6E 78
70 00 64</pre>
<p>Обратив внимание на класс TestSerial. Вы увидите, что он содержит только два байтовых поля, как показано в Листинге 5.</p>
<p><strong>Листинг 5. Поля класса TestSerial</strong></p>
<pre class="brush: java; title: ; notranslate">    public byte version = 100;
    public byte count = 0;</pre>
<p>Размер каждого из полей состовляет один байт, таким образом, итоговый размер объекта (без заголовков) состовляет два байта. Но если мы посмотрим на размер сериализованного объекта, приведённого в Листинге 4, мы увидим не 2 байта, а 51 байт. Сюрприз! Откуда появились дополнительные байты и какое их предназначение? Дополнительные байты были добавлены алгоритмом сериализации и являются жизненно важными при десериализации.</p>
<p><strong>Алгоритм сериализации в Java</strong></p>
<p>Теперь, когда мы уже знаем, как сериализовать объект, перед нами возникает другой вопрос, каким образом сериализация работает на низком уровне ? Ответ на данный вопрос дают следующие пункты:</p>
<ul>
<li>прежде всего происходит запись метаданных класса, ассоциированного с конкретным экземпляром данного класса</li>
<li>затем происходит рекурсиваня запись описания суперкласса до тех пор, пока не будет достигнут суперкласс типа java.lang.Object</li>
<li>после того, как метаданные были успешно записаны, начинается процесс записи данных экземпляра класса, причем процесс записи начинается с самого верхнего суперкласса</li>
<li>и наконец после того, как данные самого верхнего суперкласса были записаны, алгоритм сериализации рекурсивно проходит по иерархии наследования вниз к производному классу ( экземпляр которого сериализуется) и одновременно с этим проходом записывает данные, описание которых принадлежит итерируемому классу</li>
</ul>
<p>Рассмотрим сериализацию объектов на другом примере, описывающем более широкую иерархию наследования классов. Смотрите Листинг 6.</p>
<p><strong>Листинг 6. Другой пример сериализации объекта</strong></p>
<pre class="brush: java; title: ; notranslate">class Parent implements Serializable {
    int parentVersion = 10;
}

public class Contain implements Serializable {
    int containVersion = 11;
}

public class TestSerial extends Parent implements Serializable {

	int version = 66;
	Contain con = new Contain();

	public int getVersion() {
		return version;
	}

	public static void main(String args[]) throws IOException {
		FileOutputStream fos = new FileOutputStream(&quot;c:\\temp.out&quot;);
		ObjectOutputStream oos = new ObjectOutputStream(fos);
		TestSerial st = new TestSerial();
		oos.writeObject(st);
		oos.flush();
		oos.close();
	}
}</pre>
<p>Этот пример довольно простой. Он сериализует экземпляр класса TestSerial, который расширяет Parent класс и содержит экземпляр класса Contain. Представление сериализованного объекта в шестандцатиричном формате приведено в Листинге 7.</p>
<p><strong>Листинг 7. Представление сериализуемого объекта в шестнадцатиричном формате</strong></p>
<pre class="brush: java; title: ; notranslate">AC ED 00 05 73 72 00 0A 53 65 72 69 61 6C 54 65
73 74 05 52 81 5A AC 66 02 F6 02 00 02 49 00 07
76 65 72 73 69 6F 6E 4C 00 03 63 6F 6E 74 00 09
4C 63 6F 6E 74 61 69 6E 3B 78 72 00 06 70 61 72
65 6E 74 0E DB D2 BD 85 EE 63 7A 02 00 01 49 00
0D 70 61 72 65 6E 74 56 65 72 73 69 6F 6E 78 70
00 00 00 0A 00 00 00 42 73 72 00 07 63 6F 6E 74
61 69 6E FC BB E6 0E FB CB 60 C7 02 00 01 49 00
0E 63 6F 6E 74 61 69 6E 56 65 72 73 69 6F 6E 78
70 00 00 00 0B</pre>
<p>На рисунке 2 изображена последовательность выполнения алгоритма сериализации.</p>
<p><img class="aligncenter size-full wp-image-804" title="diagram" src="http://java.in.ua/wp-content/uploads/2009/06/diagram.gif" alt="" width="350" height="711" /></p>
<p style="text-align: center;">
<p><strong>Рисунок 2. Последовательность выполнения алгоритма сериализации</strong></p>
<p>Давайте детально рассмотрим представление сериализуемого объекта, приведённое в Листинге 7. Начнем с информации, которая отвечает за идентификацию протокола сериализации:</p>
<ul>
<li>AC ED: STREAM_MAGIC, определение протокола сериализации</li>
<li>00 05: STREAM_VERSION, версия сериализации</li>
<li>0&#215;73: TC_OBJECT, определение нового объекта</li>
</ul>
<p>Первым шагом алгоритма сериализации является запись метаданных класса сериализуемого экземпляра.</p>
<ul>
<li>0&#215;72: TC_CLASSDESC, определение данного класса как нового класса</li>
<li>00 0A: длинна имени класса.</li>
<li>53 65 72 69 61 6c 54 65 73 74: имя класса TestSerial</li>
<li>05 52 81 5A AC 66 02 F6: serialVersionUID класса</li>
<li>0&#215;02: этот флаг говорит о том, что объект поддерживает сериализацию</li>
<li>00 02: количество полей сериализуемого класса</li>
</ul>
<p>Далее, алгоритм записывает поле int version = 66;</p>
<ul>
<li>0&#215;49: код типа поля. 49 представляет &#8220;I&#8221;, т.е. Int</li>
<li>00 07: длинна имени поля</li>
<li>76 65 72 73 69 6F 6E: имя поля version</li>
</ul>
<p>После чего, алгоритм записывает следующее поле: Contain con = new Contain();.</p>
<ul>
<li>0&#215;74: TC_STRING: представляет новую строку</li>
<li>00 09: длинна строки</li>
<li>4C 63 6F 6E 74 61 69 6E 3B: contain;, каноническая  JVM синатура</li>
<li>0&#215;78: TC_ENDBLOCKDATA, конец опционального блока данных для объекта</li>
</ul>
<p>Следующим этапом алгоритма является запись определения Parent класса, который является суперклассом класса TestSerial.</p>
<ul>
<li>0&#215;72: TC_CLASSDESC, определяет новый класс</li>
<li>00 06: длинна имени класса</li>
<li>70 61 72 65 6E 74: имя класса TestSerial</li>
<li>0E DB D2 BD 85 EE 63 7A: serialVersionUID класса</li>
<li>0&#215;02: этот флаг говорит о том, что объект поддерживает сериализацию</li>
<li>00 01: количество полей в классе</li>
</ul>
<p>После того, как алгоритм записал информацию о Parent классе, выполнение переходит к записи информации, описывающей поля класса и их содержимое. В нашем случае класс содержит одно предварительно проинициализированное поле int parentVersion = 100;.</p>
<ul>
<li>0&#215;49: код типа поля, 49 представляет &#8220;I&#8221;, т.е. Int</li>
<li>00 0D: длинна имени поля</li>
<li>70 61 72 65 6E 74 56 65 72 73 69 6F 6E: parentVersion, имя поля</li>
<li>0&#215;78: TC_ENDBLOCKDATA, конец опционального блока данных для объекта</li>
<li>0&#215;70: TC_NULL, этот байт говорит нам о том, что даный класс не имеет суперклассов и является корневым в иерархии наследования</li>
</ul>
<p>Итак, на данном этапе алгоритм сериализации записал метаданные класса, ассоциируемого с экземпляром, а так же метаданные суперкласса класса сериализуемого экземпляра. Далее алгоритм записывает данные, ассоциируемые с экземпляром. Прежде всего это значиния суперклассов (в нашем случае значение поля parentVersion класса Parent), после чего данные класса сериализуемого экземпляра (в нашем случае данные полей класса TestSerial):</p>
<ul>
<li>00 00 00 0A: 10, значение поля parentVersion</li>
<li>00 00 00 42: 66, значение поля version</li>
</ul>
<p>Следующие байты вызывают особый интерес. Алгоритму необходимо записать информацию об экземпляре класса Contain, приведённом в Листинге 8.</p>
<p><strong>Листинг 8. Экземпляр класса Contain</strong></p>
<pre>Contain con = new Contain();</pre>
<p>Далее, алгоритм сериализации записывает метаданные класса Contain:</p>
<ul>
<li>0&#215;73: TC_OBJECT, назначение нового объекта</li>
<li>0&#215;72: TC_CLASSDESC, определяет новый класс</li>
<li>00 07: длинна имени класса</li>
<li>63 6F 6E 74 61 69 6E: contain, имя поля класса</li>
<li>FC BB E6 0E FB CB 60 C7: serialVersionUID класса</li>
<li>0&#215;02: этот флаг говорит о том, что объект поддерживает сериализацию</li>
<li>00 01: количество полей в классе</li>
</ul>
<p>После чего очередь переходит к записи данных о поле containVersion:</p>
<ul>
<li>0&#215;49: код типа поля, 49 представляет &#8220;I&#8221;, т.е. Int</li>
<li>00 0E: длинна имени поля</li>
<li>63 6F 6E 74 61 69 6E 56 65 72 73 69 6F 6E: имя поля containVersion</li>
<li>0&#215;78: TC_ENDBLOCKDATA, конец опционального блока данных для объекта</li>
</ul>
<p>После записи вышеперечисленных байт, алгоритм проверят класс Contain на наличие суперкласса. Если таков существует в иерархии наследования, алгоритм переходит к записи метаданных суперкласса. В нашем случае у класса Contain нет родителя, следовательно, алгоритм записывает TC_NULL:</p>
<ul>
<li>0&#215;70: TC_NULL</li>
</ul>
<p>В конечном итоге, алгоритм записывает данные полей класса Contain:</p>
<ul>
<li>00 00 00 0B: 11, значение поля containVersion</li>
</ul>
<p>Настал момент вздохнуть с облегчением &#8211; все байты рассмотрены.</p>
<p><strong>Заключение</strong></p>
<p>В данной статье мы познакомились с механизмом сериализации объектов в Java, а так же рассмотрели работу алгоритма сериализации в деталях. Надеюсь, полученная информация в достаточной мере помогла Вам развеять все страхи при произнесении такого магического слова, как сериализация <img src='http://java.in.ua/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p>
<p><strong>Примечание автора перевода</strong></p>
<p>За возможные ошибки в переводе прошу сильно не пинать. Спасибо за внимание <img src='http://java.in.ua/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p><span style="color: #c0c0c0;">Источник: http://www.javaworld.com/community/node/2915</span></p>
<div><script type="text/javascript" src="http://odnaknopka.ru/wp/ok2.utf8.js"></script><script type="text/javascript">okbm("http://java.in.ua/2009/06/11/java_serialization_algorithm/","Алгоритм сериализации объектов в Java")</script></div>]]></content:encoded>
			<wfw:commentRss>http://java.in.ua/2009/06/11/java_serialization_algorithm/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>В чем различие между использованием оператора instanceof и Class.isAssignableFrom(&#8230;) метода?</title>
		<link>http://java.in.ua/2009/05/18/instanceof_or_isassignablefrom/</link>
		<comments>http://java.in.ua/2009/05/18/instanceof_or_isassignablefrom/#comments</comments>
		<pubDate>Mon, 18 May 2009 10:27:29 +0000</pubDate>
		<dc:creator>Evgenij Nerush</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Class]]></category>
		<category><![CDATA[instanceof]]></category>
		<category><![CDATA[isAssignableFrom]]></category>

		<guid isPermaLink="false">http://java.in.ua/?p=708</guid>
		<description><![CDATA[Этим вопросом я задавался не один раз при разработке кода, определяющего принадлежность определённого экземпляра класса к определённой иерархии наследования, а так же принадлежность к реализации определённого интерфейса. В Java существует несколько подходов к решению данной проблемы, из которых мы обратим внимание на различие между использованием оператора instanceof и Class.isAssignableFrom(Class&#60;?&#62; cls) метода. Одним из главных различий [...]]]></description>
			<content:encoded><![CDATA[<p>Этим вопросом я задавался не один раз при разработке кода, определяющего принадлежность определённого экземпляра класса к определённой иерархии наследования, а так же принадлежность к реализации определённого интерфейса. В Java существует несколько подходов к решению данной проблемы, из которых мы обратим внимание на различие между использованием оператора <strong>instanceof</strong> и <strong>Class.isAssignableFrom(Class&lt;?&gt; cls)</strong> метода. Одним из главных различий является то, что использование оператора <strong>instanceof</strong> позволяет выявлять ошибки на уровне компиляции кода. Пример кода, позволяющий выявить ошибку времени компиляции, приведён в Листинге 1.</p>
<p><strong>Листинг 1. Некорректное использование оператора instanceof</strong></p>
<pre class="brush: java; title: ; notranslate">if(String.class instanceof Integer) {
    System.out.println(&quot;true&quot;);
}</pre>
<p>В то время как код, приведённый в Листинге 2, в конечном итоге будет выполнен без каких-либо ошибок.</p>
<p><strong>Листинг 2. Использование метода Class.isAssignableFrom(Class&lt;?&gt; cls)</strong></p>
<pre class="brush: java; title: ; notranslate">if(Integer.class.isAssignableFrom(String.class)) {
    System.out.println(&quot;true&quot;);
}</pre>
<p>Итак, использование оператора <strong>instanceof</strong> имеет место тогда, когда Вы четко знаете, в какой иерархии наследования участвует класс и какие интерфейсы он реализует, в противном случае целесообразно посмотреть в сторону <strong>Class.isAssignableFrom(Class&lt;?&gt; cls)</strong> метода, использование которого в свою очередь позволяет реализовать более гибкий код, предоставляющий возможность композиции.</p>
<div><script type="text/javascript" src="http://odnaknopka.ru/wp/ok2.utf8.js"></script><script type="text/javascript">okbm("http://java.in.ua/2009/05/18/instanceof_or_isassignablefrom/","В чем различие между использованием оператора instanceof и Class.isAssignableFrom(&amp;#8230;) метода?")</script></div>]]></content:encoded>
			<wfw:commentRss>http://java.in.ua/2009/05/18/instanceof_or_isassignablefrom/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java Reflection: работа с приватными полями и методами</title>
		<link>http://java.in.ua/2009/05/05/java-reflection-private-fields-and-methds/</link>
		<comments>http://java.in.ua/2009/05/05/java-reflection-private-fields-and-methds/#comments</comments>
		<pubDate>Tue, 05 May 2009 11:02:36 +0000</pubDate>
		<dc:creator>Evgenij Nerush</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[field]]></category>
		<category><![CDATA[method]]></category>
		<category><![CDATA[reflection]]></category>

		<guid isPermaLink="false">http://java.in.ua/?p=651</guid>
		<description><![CDATA[Используя механизм рефлексии в Java, клиент получает широкие возможности как для извлечения значений из инкапсулированных полей класса, так и для получения значений, возвращаемых инкапсулированными методами класса. Работа с приватными полями Для получения доступа к приватным полям класса, прежде всего необходимо получить экземпляр класса java.lang.reflect.Field. Для этого нужно воспользоваться Class.getDeclaredField(String name) либо Class.getDeclaredFields() методами класса Class. [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Используя механизм рефлексии в Java, клиент получает широкие возможности как для извлечения значений из инкапсулированных полей класса, так и для получения значений, возвращаемых инкапсулированными методами класса.</p></blockquote>
<h3>Работа с приватными полями</h3>
<p>Для получения доступа к приватным полям класса, прежде всего необходимо получить экземпляр класса java.lang.reflect.Field. Для этого нужно воспользоваться Class.getDeclaredField(String name) либо Class.getDeclaredFields() методами класса Class. Обратите внимание на то, что методы Сlass.getField(String name) и Class.getFields() предоставляют доступ только к полям, объявленных с  модификатором доступа public. Из этого следует, что они не предоставляют возможности для получения полей, объявленных с модификаторами доступа protected и private.</p>
<p>Рассмотрим более детально доступ к приватным полям класса на примерах, приведённых в Листингах 1 и 2.</p>
<p><strong>Листинг 1. Класс PrivateObject</strong></p>
<pre class="brush: java; title: ; notranslate">public class PrivateObject {

  private String privateString = null;

  public PrivateObject(String privateString) {
    this.privateString = privateString;
  }
}</pre>
<p><strong>Листинг 2. Реализация доступа к приватному полю класса PrivateObject</strong></p>
<pre class="brush: java; title: ; notranslate">PrivateObject privateObject = new PrivateObject(&quot;The Private Value&quot;);

Field privateStringField = PrivateObject.class.getDeclaredField(&quot;privateString&quot;);

privateStringField.setAccessible(true);

String fieldValue = (String) privateStringField.get(privateObject);
System.out.println(&quot;fieldValue = &quot; + fieldValue);</pre>
<p>При выполнении кода, приведённого в Листинге 2, на экран будет выведено сообщение &#8220;fieldValue = The Private Value&#8221;, содержащее значение приватного поля privateString класса PrivateObject. Обратите внимание на использование метода PrivateObject.class.getDeclaredField(&#8220;privateString&#8221;). Этот метод возвращает поле именно того класса, у которого непосредственно вызывается метод getDeclaredField(String name). Другими словами, этот метод не предоставляет доступ к полям, объявленных в суперклассах. Далее, вызывая метод setAccessible(true) у экземпляра privateStringField класса Field, вы тем самым предоставляете механизму рефлексии доступ к приватному полю privateString объекта privateStringField.</p>
<h3>Работа с приватными методами</h3>
<p>Для получения доступа к приватным методам класса, прежде всего необходимо получить экземпляр класса java.lang.reflect.Method. Для этого нужно воспользоваться Class.getDeclaredMethod(String name, Class[] parameterTypes) либо Class.getDeclaredMethods() методами класса Class. Заметьте, что методы Сlass.getMethod(String name) и Class.getMethods() предоставляют доступ только к методам, объявленных с  модификатором доступа public. Из этого следует, что они не предоставляют возможности для получения методов, объявленных с модификаторами доступа protected и private.</p>
<p>Рассмотрим более детально доступ к приватным методам класса на примерах, приведённых в Листингах 3 и 4.</p>
<p><strong>Листинг 3. Класс PrivateObject с приватным методом getPrivateString()</strong></p>
<pre class="brush: java; title: ; notranslate">public class PrivateObject {

  private String privateString = null;

  public PrivateObject(String privateString) {
    this.privateString = privateString;
  }

  private String getPrivateString(){
    return this.privateString;
  }
}</pre>
<p><strong>Листинг 4. Реализация доступа к приватному методу класса PrivateObject</strong></p>
<pre class="brush: java; title: ; notranslate">PrivateObject privateObject = new PrivateObject(&quot;The Private Value&quot;);

Method privateStringMethod = PrivateObject.class.getDeclaredMethod(&quot;getPrivateString&quot;, null);

privateStringMethod.setAccessible(true);

String returnValue = (String)
        privateStringMethod.invoke(privateObject, null);

System.out.println(&quot;returnValue = &quot; + returnValue);</pre>
<p>При выполнении кода, приведённого в Листинге 4, на экран будет выведено сообщение &#8220;returnValue = The Private Value&#8221;. Данное сообщение содержит значение &#8220;The Private Value&#8221;, возвращаемое методом getPrivateString(). Обратите внимание на использование метода PrivateObject.class.getDeclaredMethod(&#8220;getPrivateString&#8221;, null). Этот метод возвращает метод именно того класса, у которого непосредственно вызывается метод getDeclaredMethod(String name, Class[] parameterTypes). Другими словами, этот метод не предоставляет доступ к методам, объявленных в суперклассах. Далее, вызывая метод setAccessible(true) у экземпляра privateStringMethod класса Method, вы тем самым предоставляете механизму рефлексии доступ к приватному методу getPrivateString() объекта privateStringField.</p>
<p><span style="color: #c0c0c0;">Источник: http://tutorials.jenkov.com/</span></p>
<div><script type="text/javascript" src="http://odnaknopka.ru/wp/ok2.utf8.js"></script><script type="text/javascript">okbm("http://java.in.ua/2009/05/05/java-reflection-private-fields-and-methds/","Java Reflection: работа с приватными полями и методами")</script></div>]]></content:encoded>
			<wfw:commentRss>http://java.in.ua/2009/05/05/java-reflection-private-fields-and-methds/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vector или ArrayList &#8211; что лучше и почему?</title>
		<link>http://java.in.ua/2009/04/03/vector_or_arraylist/</link>
		<comments>http://java.in.ua/2009/04/03/vector_or_arraylist/#comments</comments>
		<pubDate>Fri, 03 Apr 2009 13:11:49 +0000</pubDate>
		<dc:creator>Evgenij Nerush</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[ArrayList]]></category>
		<category><![CDATA[LinkedList]]></category>
		<category><![CDATA[List]]></category>
		<category><![CDATA[Vector]]></category>

		<guid isPermaLink="false">http://java.in.ua/?p=614</guid>
		<description><![CDATA[Найдите разницу между Vector&#8217;ом и ArrayList&#8217;ом. Иногда лучше использовать Vector, иногда ArrayList, в некоторых случаях лучше не использовать ни то ни другое.  Существует четыре фактора, влияющих на принятие решения &#8211; что и когда лучше использовать, а именно: API Синхронизация Хранение данных Реализация Давайте более подробно остановимся на каждом из них. API В издании The Java [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Найдите разницу между Vector&#8217;ом и ArrayList&#8217;ом.</p></blockquote>
<p>Иногда лучше использовать Vector, иногда ArrayList, в некоторых случаях лучше не использовать ни то ни другое.  Существует четыре фактора, влияющих на принятие решения &#8211; что и когда лучше использовать, а именно:</p>
<ul>
<li>API</li>
<li>Синхронизация</li>
<li>Хранение данных</li>
<li>Реализация</li>
</ul>
<p>Давайте более подробно остановимся на каждом из них.</p>
<h3><span style="color: #333333;">API</span></h3>
<p>В издании <em>The Java Programming Language (Addison-Wesley, June 2000)</em> Кен Арнолд, Джеймс Гослинг и Девид Холмс описывают Vector как аналог ArrayList&#8217;а. Из этого следует, что с точки зрения API, оба класса очень похожи. Тем не менее, между этими двумя классами всё-таки есть существенные различия.</p>
<h3><span style="color: #333333;">Синхронизация</span></h3>
<p>Экземпляры класса Vector являются синхронизированными и каждый метод класса Vector является потокобезопасным, в то время как ArrayList имеет прямо противоположное описание: он не является синхронизированным и не является потокобезопасным. Из этого следует, что использование Vector&#8217;a в конечном итоге понижает производительность из-за обеспечения синхронизированного доступа к данным коллекции. Поэтому, если вам не нужна коллекция, обеспечивающая потокобезопасный доступ к данным (т.е. Vector), используйте ArrayList, зачем платить больше?</p>
<h3><span style="color: #333333;">Хранение данных</span></h3>
<p>Обе коллекции Vector и ArrayList используют массив для хранения данных. Вам нужно помнить об этом всегда. Массив, хранящий элементы, расширяется в том случае, когда он уже является полностью заполненным в момент добавления нового элемента. Каким образом реализуется расширение массива? Если мы просмотрим исходный код классов Vector и ArrayList, мы заметим, что в Vector&#8217;е происходит увеличение массива вдвое, в то время как в ArrayList&#8217;е массив увеличивается на 50%. Это является ещё одним местом, где может осуществляться существенное падение производительности. Поэтому, создавая коллекцию, задумайтесь, какой именно коэффициент вместимости (инишиал кепестити) нужен коллекции, и нужен ли он вообще. Это позволит вам избежать дополнительных расходов при расширении массива.</p>
<h3><span style="color: #333333;">Реализация</span></h3>
<p>Обе коллекции Vector и ArrayList являются хорошим решением при индексировании данных, извлечении элементов с определённой позиции, а так же при добавлении/удалении элемента в/из конец/конца списка. Если вы хотите добавлять/удялать элементы в начале либо в середине списка, используйте LinkedList. Этот класс позволяет добавлять либо удалять элементы с любых позиций за фиксированное время O(1). Однако индексирование в LinkedList обойдётся вам дороже чем в Vector/ArrayList по времени и определяется как O(i), где i &#8211; индекс элемента.</p>
<p>Если вы разрабатываете код, где производительность играет первоочередную роль, задумайтесь над использованием массива вместо списка &#8211; это позволит вам избежать затрат на синхронизацию, затрат на вызов методов, а также затрат на расширение массива. Но за это вам придеться расплачиваться временем, затраченным на разработку.</p>
<p><span style="color: #c0c0c0;">Источник: <a href="http://www.javaworld.com/javaworld/javaqa/2001-06/03-qa-0622-vector.html" target="_blank">JavaWorld</a></span></p>
<div><script type="text/javascript" src="http://odnaknopka.ru/wp/ok2.utf8.js"></script><script type="text/javascript">okbm("http://java.in.ua/2009/04/03/vector_or_arraylist/","Vector или ArrayList &amp;#8211; что лучше и почему?")</script></div>]]></content:encoded>
			<wfw:commentRss>http://java.in.ua/2009/04/03/vector_or_arraylist/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Какими бывают транзакции в Spring?</title>
		<link>http://java.in.ua/2009/03/03/transaction-propagation-in-spring/</link>
		<comments>http://java.in.ua/2009/03/03/transaction-propagation-in-spring/#comments</comments>
		<pubDate>Tue, 03 Mar 2009 13:46:51 +0000</pubDate>
		<dc:creator>Evgenij Nerush</dc:creator>
				<category><![CDATA[Spring Framework]]></category>
		<category><![CDATA[Propagation]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[Transaction]]></category>

		<guid isPermaLink="false">http://java.in.ua/?p=508</guid>
		<description><![CDATA[Заметьте, данный пост не является справочником по работе с транзакциями в Spring, а лишь описывает способы распространения транзакций. Пожалуйста, будьте ознакомлены с разницей между физическими и логическими транзакциями. В посте рассматривается версия Spring 2.5.4 Транзакции в Spring могут принимать следующие значения: REQUIRED &#8211; Является значением по умолчанию. Поддерживает текущую транзакцию, создает новую если транзакция ещё [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Заметьте, данный пост не является справочником по работе с транзакциями в Spring, а лишь описывает способы распространения транзакций.</p>
<p>Пожалуйста, будьте ознакомлены с разницей между <em>физическими</em> и <em>логическими</em> транзакциями.</p>
<p>В посте рассматривается версия Spring 2.5.4</p></blockquote>
<p>Транзакции в Spring могут принимать следующие значения:</p>
<ol>
<li><strong>REQUIRED</strong> &#8211; Является значением по умолчанию. Поддерживает текущую транзакцию, создает новую если транзакция ещё не существует. Аналогичен с атрибутом в EJB транзакции с таким же именем.</li>
<li><strong>SUPPORTS</strong> &#8211; Поддерживает текущую транзакцию, а так же выполняется вне транзакции, если на момент выполнения транзакция не была создана. Аналогичен с атрибутом в EJB транзакции с таким же именем.</li>
<li><strong>MANDATORY &#8211; </strong>Поддерживает текущую транзакцию, если на момент выполнения транзакция не была создана, выбрасывается исключение. Аналогичен с атрибутом в EJB транзакции с таким же именем.</li>
<li><strong>REQUIRES_NEW</strong><strong> &#8211; </strong>Создает новую транзакцию, приостанавливает текущую транзакцию (если она существует). Аналогичен с атрибутом в EJB транзакции с таким же именем.</li>
<li><strong>NOT_SUPPORTED </strong><strong>- </strong>Выполняется вне транзакции, приостанавливает текущую транзакцию (если она существует). Аналогичен с атрибутом в EJB транзакции с таким же именем.</li>
<li><strong>NEVER </strong><strong>- </strong>Выполняется вне транзакции, выбрасывается исключение, если транзакция существует. Аналогичен с атрибутом в EJB транзакции с таким же именем.</li>
<li><strong>NESTED</strong><strong> &#8211; </strong>Выполняется в пределах вложенной транзакции, если текущая транзакция существует. В EJB нет аналога даному атрибуту.</li>
</ol>
<p>В следующих постах мы детально рассмотрим принципы работы вышеперечисленых видов транзакций в Spring.</p>
<p>To be continued&#8230;.</p>
<div><script type="text/javascript" src="http://odnaknopka.ru/wp/ok2.utf8.js"></script><script type="text/javascript">okbm("http://java.in.ua/2009/03/03/transaction-propagation-in-spring/","Какими бывают транзакции в Spring?")</script></div>]]></content:encoded>
			<wfw:commentRss>http://java.in.ua/2009/03/03/transaction-propagation-in-spring/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Sun выводит в свет Java 6 update 12</title>
		<link>http://java.in.ua/2009/02/04/java6-update12/</link>
		<comments>http://java.in.ua/2009/02/04/java6-update12/#comments</comments>
		<pubDate>Wed, 04 Feb 2009 10:16:38 +0000</pubDate>
		<dc:creator>Evgenij Nerush</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Новости]]></category>
		<category><![CDATA[JavaSDK]]></category>

		<guid isPermaLink="false">http://java.in.ua/?p=445</guid>
		<description><![CDATA[Более детальная информация о релизе &#8211; http://java.sun.com/javase/6/webnotes/6u12.html Ссылка для скачивания &#8211; http://java.sun.com/javase/downloads/index.jsp]]></description>
			<content:encoded><![CDATA[<p>Более детальная информация о релизе &#8211; <a href="http://java.sun.com/javase/6/webnotes/6u12.html" target="_blank">http://java.sun.com/javase/6/webnotes/6u12.html</a></p>
<p>Ссылка для скачивания &#8211; <a href="http://java.sun.com/javase/downloads/index.jsp">http://java.sun.com/javase/downloads/index.jsp</a></p>
<div><script type="text/javascript" src="http://odnaknopka.ru/wp/ok2.utf8.js"></script><script type="text/javascript">okbm("http://java.in.ua/2009/02/04/java6-update12/","Sun выводит в свет Java 6 update 12")</script></div>]]></content:encoded>
			<wfw:commentRss>http://java.in.ua/2009/02/04/java6-update12/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Первое дыхание Spring Framework 3.0 milestone</title>
		<link>http://java.in.ua/2008/12/08/spring-framework-30-milestone/</link>
		<comments>http://java.in.ua/2008/12/08/spring-framework-30-milestone/#comments</comments>
		<pubDate>Mon, 08 Dec 2008 09:08:12 +0000</pubDate>
		<dc:creator>Evgenij Nerush</dc:creator>
				<category><![CDATA[Spring Framework]]></category>
		<category><![CDATA[Новости]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[Spring]]></category>

		<guid isPermaLink="false">http://java.in.ua/?p=355</guid>
		<description><![CDATA[В предверии нового года SpringSource анонсировала Spring Framework 3.0 milestone. Главной фичей релиза стала поддержка REST. Более детальную информацию о релизе можно получить на официальном тим блоге проекта.]]></description>
			<content:encoded><![CDATA[<p><img class="size-medium wp-image-170 alignleft" style="border: 0pt none;" title="spring" src="http://java.in.ua/wp-content/uploads/2008/11/spring.gif" alt="" width="150" height="100" />В предверии нового года <a href="http://SpringSource.org">SpringSource</a> анонсировала <a href="http://springframework.org/">Spring Framework</a> 3.0 milestone. Главной фичей релиза стала поддержка <a href="http://restlet.org">REST</a>. Более детальную информацию о релизе можно получить на официальном <a href="http://blog.springsource.com">тим блоге проекта</a>.</p>
<div><script type="text/javascript" src="http://odnaknopka.ru/wp/ok2.utf8.js"></script><script type="text/javascript">okbm("http://java.in.ua/2008/12/08/spring-framework-30-milestone/","Первое дыхание Spring Framework 3.0 milestone")</script></div>]]></content:encoded>
			<wfw:commentRss>http://java.in.ua/2008/12/08/spring-framework-30-milestone/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sun выводит в свет Java 6 update 11</title>
		<link>http://java.in.ua/2008/12/04/java-6-update-11/</link>
		<comments>http://java.in.ua/2008/12/04/java-6-update-11/#comments</comments>
		<pubDate>Thu, 04 Dec 2008 17:20:26 +0000</pubDate>
		<dc:creator>Evgenij Nerush</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Новости]]></category>

		<guid isPermaLink="false">http://java.in.ua/?p=345</guid>
		<description><![CDATA[Одновременно с анонсированием JavaFX, Sun в догонку выводит в свет Java 6 update 11. Более детальная информация о релизе &#8211; http://java.sun.com/javase/6/webnotes/6u11.html Ссылка для скачивания &#8211; http://java.sun.com/javase/downloads/index.jsp]]></description>
			<content:encoded><![CDATA[<p>Одновременно с <a href="http://java.in.ua/2008/12/04/javafx_10_sdk/">анонсированием</a> <a href="http://javafx.com/">JavaFX,</a> <a href="http://sun.com">Sun</a> в догонку выводит в свет <a href="http://java.com">Java</a> 6 update 11.</p>
<p>Более детальная информация о релизе &#8211; <a href="http://java.sun.com/javase/6/webnotes/6u11.html">http://java.sun.com/javase/6/webnotes/6u11.html</a></p>
<p>Ссылка для скачивания &#8211; <a href="http://java.sun.com/javase/downloads/index.jsp">http://java.sun.com/javase/downloads/index.jsp</a></p>
<div><script type="text/javascript" src="http://odnaknopka.ru/wp/ok2.utf8.js"></script><script type="text/javascript">okbm("http://java.in.ua/2008/12/04/java-6-update-11/","Sun выводит в свет Java 6 update 11")</script></div>]]></content:encoded>
			<wfw:commentRss>http://java.in.ua/2008/12/04/java-6-update-11/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

