﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Kyle's Space-文章分类-Java Skills Learning and Sharing</title><link>http://www.blogjava.net/xiaodong0417/category/51478.html</link><description>Java Study</description><language>zh-cn</language><lastBuildDate>Tue, 31 Jul 2012 15:34:27 GMT</lastBuildDate><pubDate>Tue, 31 Jul 2012 15:34:27 GMT</pubDate><ttl>60</ttl><item><title>Buffer中常用（必用）的几个方法介绍</title><link>http://www.blogjava.net/xiaodong0417/articles/383643.html</link><dc:creator>王树东</dc:creator><author>王树东</author><pubDate>Sat, 21 Jul 2012 07:07:00 GMT</pubDate><guid>http://www.blogjava.net/xiaodong0417/articles/383643.html</guid><wfw:comment>http://www.blogjava.net/xiaodong0417/comments/383643.html</wfw:comment><comments>http://www.blogjava.net/xiaodong0417/articles/383643.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaodong0417/comments/commentRss/383643.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaodong0417/services/trackbacks/383643.html</trackback:ping><description><![CDATA[首先介绍一下Buffer的使用场景，Buffer是Java NIO中非常重要的一个类，数据在各种Channel的读写时都需要这个类来缓冲。<br />
然而Buffer在读写之前需要做一些准备工作，比如：在读取Buffer里的数据之前要先在Buffer里准备好要读取数据，往Buffer里写数据时，要找出Buffer里的空余空间或者要清空Buffer等等。做以上事情方法有：clear(), flip(), rewind().因为我经常记不住这几个方法的功能，所以在此记录一下， 也供他人查找。<br />
<br />
Buffer有几个下标需要注意：position（当前位置）， limit（可度/写数据 下标的最大值）， capacity（实际空间）<br />
<strong>1.clear()</strong><br />
<p>使Buffer为一系列新的通道读取或相对放置&nbsp;操作做好准备，即为往Buffer中写数据做好准备<br />
<br />
</p>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;Buffer&nbsp;clear()<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.position&nbsp;=&nbsp;0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.limit&nbsp;=&nbsp;<span style="color: #0000FF; ">this</span>.capacity;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.mark&nbsp;=&nbsp;-1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">this</span>;<br />
&nbsp;&nbsp;}</div>
<p><strong>&nbsp;2. flip()<br /></strong>使Buffer为一系列新的通道写入或相对获取&nbsp;操作做好准备：它将限制设置为当前位置，然后将位置设置为 0。即为从Buffer中度数据做好准备<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;Buffer&nbsp;flip()<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.limit&nbsp;=&nbsp;<span style="color: #0000FF; ">this</span>.position;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.position&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.mark&nbsp;=&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">this</span>;<br />&nbsp;&nbsp;}</div></p><strong>3.rewind()<br /></strong><div>使缓冲区为重新读取已包含的数据做好准备：它使限制保持不变，将位置设置为 0。<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;Buffer&nbsp;rewind()<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.position&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.mark&nbsp;=&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">this</span>;<br />&nbsp;&nbsp;}</div></div><img src ="http://www.blogjava.net/xiaodong0417/aggbug/383643.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaodong0417/" target="_blank">王树东</a> 2012-07-21 15:07 <a href="http://www.blogjava.net/xiaodong0417/articles/383643.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ClassLoader of Java</title><link>http://www.blogjava.net/xiaodong0417/articles/376320.html</link><dc:creator>王树东</dc:creator><author>王树东</author><pubDate>Sun, 22 Apr 2012 09:15:00 GMT</pubDate><guid>http://www.blogjava.net/xiaodong0417/articles/376320.html</guid><wfw:comment>http://www.blogjava.net/xiaodong0417/comments/376320.html</wfw:comment><comments>http://www.blogjava.net/xiaodong0417/articles/376320.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaodong0417/comments/commentRss/376320.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaodong0417/services/trackbacks/376320.html</trackback:ping><description><![CDATA[乍一看到ClassLoader，我的第一感觉就是这东西好神秘啊。然后找了一下资料，略懂了一点皮毛，然后在这里和大家分享一下，这篇文章在接下来的日子里会不断的被更新，希望会越来越完善。
<div><br />
</div>
<div>首先，我们了解一下ClassLoader是干什么用的呢？</div>
<div>大家都知道，JVM解析的是Class的字节码文件，那么JVM怎样来加载这个字节码文件呢，没错，ClassLoader负责了这项重要的工作。</div>
<div><br />
</div>
<div>JDK中主要有以下几种ClassLoader：</div>
<div><br />
</div>
<div>
<p>a, Bootstrap ClassLoader/启动类加载器<br />
主要负责jdk_home/lib目录下的核心 api 或 -Xbootclasspath 选项指定的jar包装入工作.</p>
<p>&nbsp;</p>
<p>b, Extension ClassLoader/扩展类加载器<br />
主要负责jdk_home/lib/ext目录下的jar包或 -Djava.ext.dirs 指定目录下的jar包装入工作</p>
<p>&nbsp;</p>
<p>c, System ClassLoader/系统类加载器<br />
主要负责java -classpath/-Djava.class.path所指的目录下的类与jar包装入工作.</p>
<p>&nbsp;</p>
<p>b, User Custom ClassLoader/用户自定义类加载器(java.lang.ClassLoader的子类)<br />
在程序运行期间, 通过java.lang.ClassLoader的子类动态加载class文件, 体现java动态实时类装入特性.</p>
<p><br />
</p>
<p>那么我们能用ClassLoader做什么事情呢？</p>
<p>如果我们想动态的加载一个类，比如我们想实现一个Hot-Swap的应用，我们期望一个刚开发的高版本的Class在不关闭JVM的情况下让它工作，此时我们就可以实现我们自己的ClassLoader,重写里面的findClass方法。</p>
<p><br />
</p>
<p>这里我们需要注意ClassLoader的双亲委托模式，即定义ClassLoader加载一个类之前，要先委托它的父亲ClassLoader进行加载，只有当父亲ClassLoader无法加载成功后，才会由自己加载。为什么要使用这种双亲委托模式呢？&nbsp;</p>
<p><br />
第一个原因就是因为这样可以避免重复加载，当父亲已经加载了该类的时候，就没有必要子ClassLoader再加载一次。&nbsp;<br />
<br />
第二个原因就是考虑到安全因素，我们试想一下，如果不使用这种委托模式，那我们就可以随时使用自定义的String来动态替代java核心api中定义类型，这样会存在非常大的安全隐患，而双亲委托的方式，就可以避免这种情况，因为String已经在启动时被加载，所以用户自定义的ClassLoader&nbsp;无法加载另外的String。</p>
<p>&nbsp;</p>
<p><br />
</p>
<p>参考资料：</p>
<p><a href="http://www.iteye.com/topic/136427">http://www.iteye.com/topic/136427</a></p>
<p><a href="http://www.iteye.com/topic/83978">http://www.iteye.com/topic/83978</a></p>
<p><br />
</p>
</div><img src ="http://www.blogjava.net/xiaodong0417/aggbug/376320.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaodong0417/" target="_blank">王树东</a> 2012-04-22 17:15 <a href="http://www.blogjava.net/xiaodong0417/articles/376320.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>