??xml version="1.0" encoding="utf-8" standalone="yes"?>
end 的含义是所要替换的位置是到字符串缓冲区的第几个字符l束(?开始算?
2.public String subString(int start, int end)
q里start的含义是提取的子串的起始起始字符的指??开始算?
end的含义是提取的子串的最后一个字W的位置(?开始算?
]]>
问题1:采用什么方式来保存软g配置信息
问题2:怎么保存配置信息
下面׃上两个问题展开讲述:
1.保存配置文g的方法有很多U?br />
A.配|信息保存在注册表中(如果保存在注册表中对于java的跨q_性是一个破?因ؓ不同操作pȝ的所谓注册表的存储方式是不同?
B.配|信息保存在Lcd的文件中,׃Java里有专门提供用于寚w|文件读写的cd,所以我们在q里介绍propertiescd的配|文?
注意q里properties只是一个大家公认的配置文g后缀而已,没有什么特别的意义!
(当然q有其他Ҏ,在这里主要介lpropertiescd的配|文?
2.寚w|信息的操作无非׃U?从配|文件中d信息,q将信息赋值给E序中的相应变量,q有是当Y件运行到某一个特定的时?手动或自
动将软g中的某些信息写入到配|文件中,以便于以后的调用.Z方便的对propertiescd的配|文件进行操?在这里介l一个Java提供?/p>
一个类:Properties大家可以查看API以了解此cȝ详细信息.
对于最单的应用,q里只用到Properties中的三个Ҏ:
1.void load(InputStream inStream)从输入流中读取属性列表(键和元素对)。这个inStream可以有多U取得的Ҏ,q里只介l一U通过
ClassName.class.getClassLoader().getResourceAsStream()来取得properties文g.通常:ClassName.class.getClassLoader ().getResourceAsStream(““)取得的是
WEB-INF的下U目录,比如ClassName.class.getClassLoader().getResourceAsStream(“db.properties“).在Tomcat中,可以通过增加”../”来取得上层目?br />
Q即WEB-INF目录Q这样就可以把properties攑֜WEB-INF中统一理。但是WLS不识?#8221;../”。另外一U土办法Q就是不q回classLoader,
直接ClassName.class.getResourceAsStream()。然后通过多个”../”Q小?个)来返回相应的上目录。当Ӟ如果cL展了HttpServletQ可以通过
getServletContext().getRealPath("/")来取得Web部v目录的绝对\径?nbsp;
2. String getProperty(String key)用指定的键在此属性列表中搜烦属性?br />
3. Object setProperty(String key, String value)调用 Hashtable 的方?put?br />
4. void store(OutputStream out, String comments) 以适合使用 load(InputStream) Ҏ加蝲到Properties 表中的格式,此Properties 表中的属性列表(键和元素对)
写入输出?/p>
在读之前必须要用1Ҏ得到输入?在写之前必须先徏一个到配置文g的输出流作ؓ4的参?写完后用4Ҏ
处于Singleton设计模式的考虑,把整个对配置文g的操作写成一个类,q且所有变量方法全部设|ؓ静?/p>
JVM启动Q会形成3个类加蝲器组成的初始化加载器层次l构Q?br />
bootstap classloader Q加载核心类Q?
||
extension classloaderQ加载ext(目录)Q即java.ext.dirs()Q?br />
||
system classloader Q加?classpath或者java.class.path或者CLASSPATHQ?/p>
ClassLoader机制Q?br />
aQ全盘负责:一个classloader加蝲一个class后,q个class所引用或者依赖的cMp个classloader载入Q除非显C的用另一个classloader载入
bQ委托机Ӟ先由父加载器加蝲Q除非父加蝲器找不到时才从自qc\径中d?br />
cQCache机制Qclassloader采用~存机制Q即先查cacheQ若cache中保存了q个classq接返回;若无Q才从文件读取和转化为classq放入cache
ClassLoader加蝲c顺序:
1Q检查cache是否有该c:
11Q若有直接返?br />
12Q若无,h父类加蝲
121) 若无?则从bootstap classloader加蝲
2Q加载:
21Q寻找class文gQ丛与此classloader相关的类路径中寻找)
22Q从文g载入class
23Q找不到则抛出ClassNotFoundeException
3Q扩展:
记蝲时即2Q,覆写findClass可以实现自己的蝲入策?br />
记蝲时即2Q,覆写loadClass来实现自q载入q程
如何实现q行时动态蝲入与更新
本质Q只要动态改cL索\径和清除classloader的cache已蝲入的classok
做法Q?br />
1Q承ClassLoaderQ覆写loadClassҎQ动态寻找class文g
2Q只要重C用一个新的类搜烦路径来new一个classloader可以,q样既更Ccȝ搜烦路径以便来蝲入新的classQ也更新生成了一个空白的cache
classloader载入的方?br />
1QPre-loading 预先载入Q蝲入基c?br />
2Qload-on-demand 按需求蝲?/p>
JDK为啥有两个JREQ?br />
JDK中jre是运行java本n的程序,如javac
ProgramFileQ默认安装)中jre是运行用L写的javaE序
classloader有啥妙用Q?Q?
q个问题得从自定义的classloaderw上_那自定义classloader~由是什么呢Q?br />
告诉你:大多是因为编译时无法预知q行旉要哪些类Q特别是app serverQ因此自定义classloaderQ运行时指定路径Q来加蝲q个路径下的class
Ҏ说明
Ҏ说明1Q如果没有特D指定,用户自定义的classloader都把system classloader作ؓ它的父加载器
Ҏ说明2Qjvm认ؓ不同的classloade载入相同名字的class是不同的Q即使从同一个class文g载入
classloader有啥妙用Q?Q?
看到Ҏ说明2Q你或许׃感觉疑惑或者不爽;啥概念?
以servlet、ejb{容器来剖析q个问题Q?/p>
接口或者基cL入classpath <---------system classloader
执行Ӟ动态蝲入实现或者承这些接口或者基cȝ子类Q?lt;---------customized classloader
||
||
用customized classloader载入cLQ发现它有一个父cclassQextendsQ;
但是在蝲入它Ӟjvm先加载父cclassQ?q个父类是system classloader能识别的Q?Ҏ“委托机制”它将由system classloader来加载;
然后customized classloaderQ实际是system classloader来加载)再蝲入这个class,创徏一个实例,转型为父c;
jvm׃用system classloader再次载入父类classQ然后将此实例{型ؓq个父类classQ?/p>
q个q程加蝲了两个父cclassQ都是由system classloader载入Q即同一个classloader载入同一个文Ӟ造型不会由异?/p>
web app server大概是这样工作的Q这栯入了Ml承了servlet的classq正运行它们,不管class是什么,都它们实例化Z个servlet class