﻿<?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-FINDER-文章分类-J2SE</title><link>http://www.blogjava.net/bluexjz/category/36484.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 04 Jun 2009 16:18:01 GMT</lastBuildDate><pubDate>Thu, 04 Jun 2009 16:18:01 GMT</pubDate><ttl>60</ttl><item><title>StringBuffer的方法中指针的不同含义</title><link>http://www.blogjava.net/bluexjz/articles/248013.html</link><dc:creator>FINDER</dc:creator><author>FINDER</author><pubDate>Wed, 24 Dec 2008 02:21:00 GMT</pubDate><guid>http://www.blogjava.net/bluexjz/articles/248013.html</guid><wfw:comment>http://www.blogjava.net/bluexjz/comments/248013.html</wfw:comment><comments>http://www.blogjava.net/bluexjz/articles/248013.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bluexjz/comments/commentRss/248013.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bluexjz/services/trackbacks/248013.html</trackback:ping><description><![CDATA[1.public StringBuffer replace(int start, int end,&nbsp; String str)<br />
&nbsp;&nbsp;&nbsp; 这里start的含义是所要替换的位置是从字符串缓冲区的第几个字符开始(从1开始算的)<br />
&nbsp;&nbsp;&nbsp;&nbsp;end 的含义是所要替换的位置是到字符串缓冲区的第几个字符结束(从1开始算的)<br />
2.public String subString(int start, int end)<br />
&nbsp;&nbsp;&nbsp;&nbsp;这里start的含义是提取的子串的起始起始字符的指针(从0开始算的)<br />
&nbsp;&nbsp;&nbsp;&nbsp;end的含义是提取的子串的最后一个字符的位置(从1开始算的)<br />
 <img src ="http://www.blogjava.net/bluexjz/aggbug/248013.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bluexjz/" target="_blank">FINDER</a> 2008-12-24 10:21 <a href="http://www.blogjava.net/bluexjz/articles/248013.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>配置文件的写法(properties类型)</title><link>http://www.blogjava.net/bluexjz/articles/247919.html</link><dc:creator>FINDER</dc:creator><author>FINDER</author><pubDate>Tue, 23 Dec 2008 07:27:00 GMT</pubDate><guid>http://www.blogjava.net/bluexjz/articles/247919.html</guid><wfw:comment>http://www.blogjava.net/bluexjz/comments/247919.html</wfw:comment><comments>http://www.blogjava.net/bluexjz/articles/247919.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bluexjz/comments/commentRss/247919.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bluexjz/services/trackbacks/247919.html</trackback:ping><description><![CDATA[&nbsp;
<p style="background: white">先提出下面两个问题:<br />
&nbsp;&nbsp;&nbsp;&nbsp;问题1:采用什么方式来保存软件配置信息<br />
&nbsp;&nbsp;&nbsp;&nbsp;问题2:怎么保存配置信息<br />
下面就以上两个问题展开讲述:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.保存配置文件的方法有很多种<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A.将配置信息保存在注册表中(如果保存在注册表中对于java的跨平台性是一个破坏,因为不同操作系统的所谓注册表的存储方式是不同的)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;B.将配置信息保存在任意类型的文件中,由于Java里有专门提供用于对配置文件读写的类库,所以我们在这里介绍properties类型的配置文件,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;注意这里properties只是一个大家公认的配置文件后缀而已,没有什么特别的意义!</p>
<p style="background: white; margin-left: 21pt; text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;(当然还有其他方法,在这里主要介绍properties类型的配置文件)<br />
&nbsp;2.对配置信息的操作无非就两种,从配置文件中读取信息,并将信息赋值给程序中的相应变量,还有就是当软件运行到某一个特定的时候,手动或自</p>
<p style="background: white; margin-left: 21pt; text-indent: 21pt">动将软件中的某些信息写入到配置文件中,以便于以后的调用.为了方便的对properties类型的配置文件进行操作,在这里介绍一个Java提供的</p>
<p style="background: white; margin-left: 21pt; text-indent: 21pt">一个类:Properties大家可以查看API以了解此类的详细信息.<br />
&nbsp;&nbsp;&nbsp; 对于最简单的应用,这里只用到Properties中的三个方法:<br />
&nbsp;&nbsp;&nbsp;&nbsp;1.void <a href="mk:@MSITStore:D:"  学习资料?教程?Java?API?JDK6.0%20中文文档.CHM:: java util Properties.html#load(java.io.InputStream)?>load</a>(<a title="java.io 中的类" href="mk:@MSITStore:D:"  学习资料?教程?Java?API?JDK6.0%20中文文档.CHM:: java io InputStream.html?>InputStream</a>&nbsp;inStream)从输入流中读取属性列表（键和元素对）。这个inStream可以有多种取得的方法,这里只介绍一种通过<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ClassName.class.getClassLoader().getResourceAsStream()来取得properties文件.通常:ClassName.class.getClassLoader ().getResourceAsStream(&#8220;&#8220;)取得的是<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WEB-INF的下级目录，比如ClassName.class.getClassLoader().getResourceAsStream(&#8220;db.properties&#8220;).在Tomcat中，可以通过增加&#8221;../&#8221;来取得上层目录<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;，即WEB-INF目录，这样就可以把properties放在WEB-INF中统一管理。但是WLS不识别&#8221;../&#8221;。另外一种土办法，就是不返回classLoader,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;直接ClassName.class.getResourceAsStream()。然后通过多个&#8221;../&#8221;（小于6个）来返回相应的上级目录。当然，如果类扩展了HttpServlet，可以通过<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getServletContext().getRealPath("/")来取得Web部署目录的绝对路径。&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;2.&nbsp;<a lang="" title="java.lang 中的类" href="mk:@MSITStore:D:"  学习资料?教程?Java?API?JDK6.0%20中文文档.CHM:: java String.html?>String</a>&nbsp;<a href="mk:@MSITStore:D:"  学习资料?教程?Java?API?JDK6.0%20中文文档.CHM:: java util Properties.html#getProperty(java.lang.String)?>getProperty</a>(<a lang="" title="java.lang 中的类" href="mk:@MSITStore:D:"  学习资料?教程?Java?API?JDK6.0%20中文文档.CHM:: java String.html?>String</a>&nbsp;key)用指定的键在此属性列表中搜索属性。<br />
&nbsp;&nbsp;&nbsp;&nbsp;3.&nbsp;<a lang="" title="java.lang 中的类" href="mk:@MSITStore:D:"  学习资料?教程?Java?API?JDK6.0%20中文文档.CHM:: java Object.html?>Object</a>&nbsp;<a href="mk:@MSITStore:D:"  学习资料?教程?Java?API?JDK6.0%20中文文档.CHM:: java util Properties.html#setProperty(java.lang.String, java.lang.String)?>setProperty</a>(<a lang="" title="java.lang 中的类" href="mk:@MSITStore:D:"  学习资料?教程?Java?API?JDK6.0%20中文文档.CHM:: java String.html?>String</a>&nbsp;key, <a lang="" title="java.lang 中的类" href="mk:@MSITStore:D:"  学习资料?教程?Java?API?JDK6.0%20中文文档.CHM:: java String.html?>String</a>&nbsp;value)调用 Hashtable 的方法 put。<br />
&nbsp;&nbsp;&nbsp;&nbsp;4.&nbsp;&nbsp;void&nbsp;&nbsp; <a href="mk:@MSITStore:D:"  学习资料?教程?Java?API?JDK6.0%20中文文档.CHM:: java util java.lang.String)? Properties.html#store(java.io.OutputStream,>store</a>(<a title="java.io 中的类" href="mk:@MSITStore:D:"  学习资料?教程?Java?API?JDK6.0%20中文文档.CHM:: java io OutputStream.html?>OutputStream</a>&nbsp;out, <a lang="" title="java.lang 中的类" href="mk:@MSITStore:D:"  学习资料?教程?Java?API?JDK6.0%20中文文档.CHM:: java String.html?>String</a>&nbsp;comments) 以适合使用 <a href="mk:@MSITStore:D:"  学习资料?教程?Java?API?JDK6.0%20中文文档.CHM:: java util Properties.html#load(java.io.InputStream)?>load(InputStream)</a> 方法加载到Properties 表中的格式，将此Properties 表中的属性列表（键和元素对）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;写入输出流。</p>
<p style="background: white; margin-left: 42pt"><br />
在读之前必须要用1方法得到输入流,在写之前必须先建一个到配置文件的输出流作为4的参数,写完后用4方法<br />
处于Singleton设计模式的考虑,建议把整个对配置文件的操作写成一个类,并且将所有变量方法全部设置为静态</p>
<img src ="http://www.blogjava.net/bluexjz/aggbug/247919.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bluexjz/" target="_blank">FINDER</a> 2008-12-23 15:27 <a href="http://www.blogjava.net/bluexjz/articles/247919.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于Class类中的几个方法的解释</title><link>http://www.blogjava.net/bluexjz/articles/247911.html</link><dc:creator>FINDER</dc:creator><author>FINDER</author><pubDate>Tue, 23 Dec 2008 06:46:00 GMT</pubDate><guid>http://www.blogjava.net/bluexjz/articles/247911.html</guid><wfw:comment>http://www.blogjava.net/bluexjz/comments/247911.html</wfw:comment><comments>http://www.blogjava.net/bluexjz/articles/247911.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bluexjz/comments/commentRss/247911.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bluexjz/services/trackbacks/247911.html</trackback:ping><description><![CDATA[<p>getClassLoader():取得当前类的加载器ClassName.class.getClassLoader()(以下内容为转载他人)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>JVM启动，会形成3个类加载器组成的初始化加载器层次结构：<br />
bootstap classloader （加载核心类） <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ||<br />
extension classloader（加载ext(目录)，即java.ext.dirs()）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ||<br />
system classloader&nbsp;&nbsp; （加载-classpath或者java.class.path或者CLASSPATH）</p>
<p><br />
ClassLoader机制：<br />
a）全盘负责：一个classloader加载一个class后，这个class所引用或者依赖的类也由这个classloader载入，除非显示的用另一个classloader载入<br />
b）委托机制：先由父加载器加载，除非父加载器找不到时才从自己的类路径中去寻找<br />
c）Cache机制：classloader采用缓存机制，即先查cache；若cache中保存了这个class就直接返回；若无，才从文件读取和转化为class并放入cache</p>
<p>&nbsp;</p>
<p>ClassLoader加载类顺序：<br />
1）检查cache是否有该类：<br />
&nbsp;&nbsp;&nbsp; 11）若有直接返回<br />
&nbsp;&nbsp;&nbsp; 12）若无，请求父类加载<br />
&nbsp;&nbsp;&nbsp; 　　　　121) 若无父,则从bootstap classloader加载<br />
2）加载：<br />
&nbsp;&nbsp;&nbsp; 21）寻找class文件（丛与此classloader相关的类路径中寻找）<br />
&nbsp;&nbsp;&nbsp; 22）从文件载入class<br />
&nbsp;&nbsp;&nbsp; 23）找不到则抛出ClassNotFoundeException<br />
3）扩展：<br />
&nbsp;&nbsp;&nbsp; 记载时即2），覆写findClass可以实现自己的载入策略<br />
&nbsp;&nbsp;&nbsp; 记载时即2），覆写loadClass来实现自己的载入过程</p>
<p><br />
如何实现运行时动态载入与更新<br />
本质：只要动态改类搜索路径和清除classloader的cache已载入的class就ok<br />
做法：<br />
1）继承ClassLoader：覆写loadClass方法，动态寻找class文件<br />
2）只要重新使用一个新的类搜索路径来new一个classloader就可以，这样既更新了类的搜索路径以便来载入新的class，也更新生成了一个空白的cache</p>
<p><br />
classloader载入的方式<br />
1）Pre-loading 预先载入，载入基础类<br />
2）load-on-demand 按需求载入</p>
<p><br />
JDK为啥有两个JRE？<br />
JDK中jre是运行java本身的程序，如javac<br />
ProgramFile（默认安装）中jre是运行用户编写的java程序<br />
</p>
<p><br />
&nbsp;</p>
<p>classloader有啥妙用（1）？<br />
这个问题得从自定义的classloader身上说，那自定义classloader缘由是什么呢？<br />
告诉你：大多是因为编译时无法预知运行时需要哪些类，特别是app server；因此自定义classloader，运行时指定路径，来加载这个路径下的class</p>
<p><br />
特殊说明<br />
特殊说明1：如果没有特殊指定，用户自定义的classloader都把system classloader作为它的父加载器<br />
特殊说明2：jvm认为不同的classloade载入相同名字的class是不同的，即使从同一个class文件载入</p>
<p><br />
classloader有啥妙用（2）？<br />
看到特殊说明2，你或许就会感觉疑惑或者不爽；啥概念？<br />
以servlet、ejb等容器来剖析这个问题：</p>
<p>将接口或者基类放入classpath&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;---------system classloader<br />
执行时，动态载入实现或者继承这些接口或者基类的子类；&lt;---------customized classloader<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ||<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ||<br />
用customized classloader载入类时，发现它有一个父类class（extends）；<br />
但是在载入它时，jvm先加载父类class； 这个父类是system classloader能识别的； 根据&#8220;委托机制&#8221;它将由system classloader来加载；<br />
然后customized classloader（实际是system classloader来加载）再载入这个class,创建一个实例，转型为父类；<br />
jvm就使用system classloader再次载入父类class，然后将此实例转型为这个父类class；</p>
<p>这个过程加载了两个父类class，都是由system classloader载入；即同一个classloader载入同一个文件，造型不会由异常</p>
<p>web app server大概是这样工作的；这样载入了任何继承了servlet的class并正确运行它们，不管class是什么，都它们实例化为一个servlet class</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;</p>
<img src ="http://www.blogjava.net/bluexjz/aggbug/247911.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bluexjz/" target="_blank">FINDER</a> 2008-12-23 14:46 <a href="http://www.blogjava.net/bluexjz/articles/247911.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>