??xml version="1.0" encoding="utf-8" standalone="yes"?>久久久午夜视频,国产精品久久久久久av福利软件,欧美蜜桃一区二区三区http://www.aygfsteel.com/thisliy/category/37188.htmlzh-cnThu, 24 Dec 2009 07:50:26 GMTThu, 24 Dec 2009 07:50:26 GMT60JNDI详解http://www.aygfsteel.com/thisliy/archive/2009/12/20/306721.htmlliyangliyangSun, 20 Dec 2009 04:29:00 GMThttp://www.aygfsteel.com/thisliy/archive/2009/12/20/306721.htmlJNDI
Java Naming and Directory Interface

首先需要对naming与directory 有最基本的认识,q而了解用JNDI 的原因:
1、naming
Naming 在电脑系l上是最基本的服务之一Q藉著名U?(names)与物?(objects)的系l?(binding)Q用者透过正确地描q环?context)来存取欲使用的物件。例如:DNS(Domain Name System)主机名U?javacenter.cis.th u.edu.tw」对应到 IP Address?140.128.104.30」,以方便用者记忆?
2、directory
Directory可视?naming概念的扩充,让物件拥有属?(attributes)以记录额外的资讯。於是,我们可以透过名称来查?look up)物gq获得该物g的属性资讯,或是利用属性作为搜ȝqo条g (search filter)。例如:电话,记录著每个h登记的电话号码。从q个最常见的例子中不难看出directory?database明显的差异之一Qdirectory 的属性可以有很多W资料,正如每个人可以同时拥有很多个电话L?Directory目前在电脑系l上较著名的应用pȝ与架构有 Novell公司?NDS(Novell Directory Services)、Sun公司的NIS(Network Information Service)Q与卛_成ؓ|络上一个新标准?LDAP(Lightweight Directory Access Protocol)?br />
JNDI(Java Naming and Directory Interface)是SUN公司提供的一U标准的Java命名pȝ接口QJNDI提供l一的客LAPIQ通过不同的访问提供者接口JNDI SPI的实玎ͼq理者将JNDI API映射为特定的命名服务和目录系l,使得Java应用E序可以和这些命名服务和目录服务之间q行交互。集JNDI实现了高可靠性JNDI[8]Q通过服务器的集群Q保证了JNDI的负载^衡和错误恢复。在全局׃n的方式下Q集中的一个应用服务器保证本地JNDI树的独立性,q拥有全局的JNDI 树。每个应用服务器在把部v的服务对象绑定到自己本地的JNDI树的同时Q还l定C个共享的全局JNDI树,实现全局JNDI和自wJNDI的联pR?br />
JNDI是一个应用程序设计的APIQؓ开发h员提供了查找和访问各U命名和目录服务的通用、统一的接口,cMJDBC都是构徏在抽象层上?br />
JNDI可访问的现有的目录及服务有:
DNS、XNam 、Novell目录服务、LDAP(Lightweight Directory Access Protocol d目录讉K协议)?CORBA对象服务、文件系l、Windows XP/2000/NT/Me/9x的注册表、RMI、DSML v1&v2、NIS?br />
JNDI优点Q?br /> 包含了大量的命名和目录服务,使用通用接口来访问不同种cȝ服务Q?br /> 可以同时q接到多个命名或目录服务上;
建立起逻辑兌Q允许把名称同Java对象或资源关联v来,而不必指导对象或资源的物理ID?br />
JNDIE序包:
javax.namingQ命名操作;
javax.naming.directoryQ目录操作;
javax.naming.eventQ在命名目录服务器中h事g通知Q?br /> javax.naming.ldapQ提供LDAP支持Q?br /> javax.naming.spiQ允许动态插入不同实现?br /> 利用JNDI的命名与服务功能来满企业APIs对命名与服务的访问,诸如EJBs、JMS、JDBC 2.0以及IIOP上的RMI通过JNDI来用CORBA的命名服务?br /> JNDI与JDBCQ?br /> JNDI提供了一U统一的方式,可以用在|络上查扑֒讉K服务。通过指定一个资源名Uͼ该名U对应于数据库或命名服务中的一个纪录,同时q回数据库连接徏立所必须的信息?br /> 代码CZQ?br /> try{
Context cntxt = new InitialContext();
DataSource ds = (DataSource) cntxt.lookup("jdbc/dpt");
}
catch(NamingException ne){
...
}

JNDI与JMSQ?br /> 消息通信是Y件组件或应用E序用来通信的一U方法。JMS是一U允许应用程序创建、发送、接收、和d消息的JAVA技术?br /> 代码CZQ?br /> try{
Properties env = new Properties();
InitialContext inictxt = new InitialContext(env);
TopicConnectionFactory connFactory = (TopicConnectionFactory) inictxt.lookup("TTopicConnectionFactory");
...
}
catch(NamingException ne){
...
}

讉K特定目录QD个例子,人是个对象,他有好几个属性,诸如q个人的姓名、电话号码、电子邮件地址、邮政编码等属性。通过getAttributes()Ҏ
Attribute attr =directory.getAttributes(personName).get("email");
String email = (String)attr.get();
通过使用JNDI让客户用对象的名称或属性来查找对象Q?br /> foxes = directory.search("o=Wiz,c=US", "sn=Fox", controls);
通过使用JNDI来查找诸如打印机、数据库q样的对象,查找打印机的例子Q?br /> Printer printer = (Printer)namespace.lookup(printerName);
printer.print(document);

览命名I间Q?br /> NamingEnumeration list = namespace.list("o=Widget, c=US");
while (list.hasMore()) {
NameClassPair entry = (NameClassPair)list.next();
display(entry.getName(), entry.getClassName());
}

常用的JNDI操作Q?br /> void bind(String sName,Object object);――绑定:把名U同对象兌的过E?br /> void rebind(String sName,Object object);――重新绑定:用来把对象同一个已l存在的名称重新l定
void unbind(String sName);――释放:用来把对象从目录中释攑և?br /> void lookup(String sName,Object object);――查找:q回目录ȝ一个对?br /> void rename(String sOldName,String sNewName);――重命名Q用来修改对象名U绑定的名称
NamingEnumeration listBinding(String sName);――清单:q回l定在特定上下文中对象的清单列表
NamingEnumeration list(String sName);

代码CZQ重新得C名称、类名和l定对象?br /> NamingEnumeration namEnumList = ctxt.listBinding("cntxtName");
...
while ( namEnumList.hasMore() )   {
Binding bnd = (Binding) namEnumList.next();
String sObjName = bnd.getName();
String sClassName = bnd.getClassName();
SomeObject objLocal = (SomeObject) bnd.getObject();
}

liyang 2009-12-20 12:29 发表评论
]]>
String.getBytes()和new String()http://www.aygfsteel.com/thisliy/archive/2009/12/09/305313.htmlliyangliyangWed, 09 Dec 2009 09:27:00 GMThttp://www.aygfsteel.com/thisliy/archive/2009/12/09/305313.html

在Java中,String.getBytes(String decode)Ҏ会根据指定的decode~码q回某字W串在该~码下的byte数组表示Q如

byte[] b_gbk = "?.getBytes("GBK");
byte[] b_utf8 = "?.getBytes("UTF-8");
byte[] b_iso88591 = "?.getBytes("ISO8859-1");

分别返?#8220;?#8221;q个汉字在GBK、UTF-8和ISO8859-1~码下的byte数组表示Q此时b_gbk的长度ؓ2Qb_utf8的长度ؓ3Qb_iso88591的长度ؓ1?/p>

而与getBytes相对的,可以通过new String(byte[], decode)的方式来q原q个“?#8221;字时Q这个new String(byte[], decode)实际是用decode指定的编码来byte[]解析成字W串?/p>

String s_gbk = new String(b_gbk,"GBK");
String s_utf8 = new String(b_utf8,"UTF-8");
String s_iso88591 = new String(b_iso88591,"ISO8859-1");

通过打印s_gbk、s_utf8和s_iso88591Q会发现Qs_gbk和s_utf8都是“?#8221;Q而只有s_iso88591是一个不认识 的字W,Z么用ISO8859-1~码再组合之后,无法q原“?#8221;字呢Q其实原因很单,因ؓISO8859-1~码的编码表中,Ҏ没有包含汉? 字符Q当然也无法通过"?.getBytes("ISO8859-1");来得到正的“?#8221;字在ISO8859-1中的~码gQ所以再通过new String()来还原就无从谈v了?/p>

因此Q通过String.getBytes(String decode)Ҏ来得到byte[]Ӟ一定要定decode的编码表中确实存在String表示的码|q样得到的byte[]数组才能正确被还原?/p>

有时候,Z让中文字W适应某些Ҏ要求Q如http header头要求其内容必须为iso8859-1~码Q,可能会通过中文字W按照字节方式来~码的情况,?/p>

String s_iso88591 = new String("?.getBytes("UTF-8"),"ISO8859-1")Q这样得到的s_iso8859-1字符串实际是三个? ISO8859-1中的字符Q在这些字W传递到目的地后Q目的地E序再通过相反的方式String s_utf8 = new String(s_iso88591.getBytes("ISO8859-1"),"UTF-8")来得到正的中文汉字“?#8221;。这样就既保证了遵守? 议规定、也支持中文?/p>

liyang 2009-12-09 17:27 发表评论
]]>
Classloader的基本概?/title><link>http://www.aygfsteel.com/thisliy/archive/2009/10/31/300528.html</link><dc:creator>liyang</dc:creator><author>liyang</author><pubDate>Sat, 31 Oct 2009 15:20:00 GMT</pubDate><guid>http://www.aygfsteel.com/thisliy/archive/2009/10/31/300528.html</guid><wfw:comment>http://www.aygfsteel.com/thisliy/comments/300528.html</wfw:comment><comments>http://www.aygfsteel.com/thisliy/archive/2009/10/31/300528.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/thisliy/comments/commentRss/300528.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/thisliy/services/trackbacks/300528.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: 微Y雅黑"><span style="font-family: q圆"><span style="font-size: 10pt">        Classloader在运行期会以?子的层次l构存在Q每个Classloader的实例都持有其父Classloader的引用,而父Classloaderq不持有子Classloader的引用,从而Ş成一条单向链Q当一个类装蝲h被提交到某个ClassloaderӞ光认的c装载过E如下:<br /> </span></span></span></span></span> <li> <p><span style="color: red"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: 微Y雅黑"><span style="font-family: q圆"><span style="font-size: 10pt">查这个类有没有被装蝲q,如果已经装蝲q,则直接返回;</span></span></span></span></span></span></p> <li> <p><span style="color: red"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: 微Y雅黑"><span style="font-family: q圆"><span style="font-size: 10pt">调用父Classloader去装载类Q如果装载成功直接返回;</span></span></span></span></span></span></p> <li> <p><span style="color: red"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: 微Y雅黑"><span style="font-family: q圆"><span style="font-size: 10pt">调用自n的装载类的方法,如果装蝲成功直接q回Q?/span></span></span></span></span></span></p> <li> <p><span style="color: red"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: 微Y雅黑"><span style="font-family: q圆"><span style="font-size: 10pt">上述所有步骤都没有成功装蝲到类Q抛出ClassNotFoundExceptionQ?/span></span></span></span></span></span></p> </li> <p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: 微Y雅黑"><span style="font-family: q圆"><span style="font-size: 10pt">        每一层次的Classloader都重复上q动作?/span></span></span></span></span></p> <p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: 微Y雅黑"><span style="font-family: q圆"><span style="font-size: 10pt">        单说Q当Classloader链上的某一Classloader收到c装载请求时Q会按顺序向上询问其所有父节点Q直x端QBootstrapClassLoaderQ,M一个节Ҏ功受理了此请求,则返回,如果所有父节点都不能受理,q时候才ph的Classloader自n来装载这个类Q如果仍然不能装载,则抛出异常?br /> <br /> <strong>c装载的方式</strong></span></span></span></span></span></p> <p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: 微Y雅黑"><span style="font-family: q圆"><span style="font-size: 10pt">        c装载的方式主要有两U:<span style="background-color: #ffff00">昑ּ</span>的和<span style="background-color: #ffff00">隐式</span>的?/span></span></span></span></span></p> <p><u><em><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: 微Y雅黑"><span style="font-family: q圆"><span style="font-size: 10pt">        昑ּc装?/span></span></span></span></span></em></u></p> <p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: 微Y雅黑"><span style="font-family: q圆"><span style="font-size: 10pt">        发生在用以下方法调用进行装载类的时候:</span></span></span></span></span></p> <p><span style="color: red"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: 微Y雅黑"><span style="font-family: q圆"><span style="font-size: 10pt">        ClassLoader.loadClass()Q用指定的Classloaderq行装蝲Q?/span></span></span></span></span></span></p> <p><span style="color: red"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: 微Y雅黑"><span style="font-family: q圆"><span style="font-size: 10pt">        Class.forName()Q用当前类的Caller Classloaderq行装蝲Q?/span></span></span></span></span></span></p> <p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: 微Y雅黑"><span style="font-family: q圆"><span style="font-size: 10pt">        当调用上q方法的时候,指定的ClassQ以cd为参敎ͼ由Classloader装入?span style="color: red"><span style="background-color: #ffff00"><span style="color: red">q两个方法的行ؓ有轻微的区别QClass.forName()在类装蝲完成后,会对c进行初始化Q而ClassLoader.loadClass()只负责装载类</span></span>?/span></span></span></span></span></span></p> <p><u><em><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: 微Y雅黑"><span style="font-family: q圆"><span style="font-size: 10pt">        隐式c装?/span></span></span></span></span></em></u></p> <p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: 微Y雅黑"><span style="font-family: q圆"><span style="font-size: 10pt">        发生在由于引用、实例化或承导致需要装载类的时候。隐式类装蝲是在q后启动的,JVM会解析必要的引用q装载类?/span></span></span></span></span></p> <p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: 微Y雅黑"><span style="font-family: q圆"><span style="font-size: 10pt">        cȝ装蝲通常l合了显式和隐式两种方式。例如,Classloader可能先显式地装蝲一个类Q然后再隐式地装载它引用的其它类?br /> <br /> </span></span></span></span></span><strong><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: 微Y雅黑"><span style="font-family: q圆"><span style="font-size: 10pt">一个基本的Classloader的层ơ结?br />         <br />                                                             <img src="http://infocenter.apusic.com/help/topic/aas/v6/img/cl1.jpg" align="center" alt="" /><br /> </span></span></span></span></span></strong></p> <p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: 微Y雅黑"><span style="font-family: q圆"><span style="font-size: 10pt">        上图昄了一个基本的Classloader的层ơ结构?span style="color: red; background-color: #ffff00">在给定层ơ上的Classloader不能引用M层次低于它的ClassloaderQ另外,它的子Classloader装蝲的类对于其是不可见的?/span>在上图中Q如果Foo.class是由ClassLoaderB装蝲的,q且Foo.class依赖于Bar.classQ那么Bar.class必须由ClassLoaderA或B装蝲。如果Bar.class只是对ClassLoaderC和D可见Q那么将会发生ClassNotFoundException或者NoClassDefFoundError异常?/span></span></span></span></span></p> <p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: 微Y雅黑"><span style="font-family: q圆"><span style="font-size: 10pt">如果Bar.class分别对于两个q的Classloader可见Q例如C和DQ,但对于它们的父Classloader不可见,那么当类装蝲h发送到q两个ClassloaderӞ每一个Classloader会装载自q本的cRClassLoaderC装蝲的Bar.class的实例将不兼容于ClassLoaderD装蝲的Bar.class的实例。如果对Classloader的层ơ结构不了解Q试图用由ClassLoaderC装蝲的类去造型一个ClassLoaderD装蝲的Bar.class的实例,则会发生造型p|QClassCastExceptionQ?/span></span></span></span></span></p> <p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: 微Y雅黑"><span style="font-family: q圆"><span style="font-size: 10pt"><strong>基本的Classloader<br /> </strong>        最基本的Classloader是Bootstrap Classloader和System ClassloaderQ也有hUC为AppClassLoaderQ,只要写过javaE序Q都会用到这两个Classloader?/span></span></span></span></span></p> <ul type="disc"> <li> <p><strong><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: 微Y雅黑"><span style="font-family: q圆"><span style="font-size: 10pt">Bootstrap Classloader</span></span></span></span></span></strong></p> <p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: 微Y雅黑"><span style="font-family: q圆"><span style="font-size: 10pt">q个Classloader装蝲Java虚拟机提供的基本q行时刻c($JAVA_HOME/jre/libQ,q包括放|在pȝ扩展目录Q?JAVA_HOME/jre/lib/extQ内的JAR文g中的cR这个Classloader是javaE序最层的ClassloaderQ只有它没有父Classloader。如果你一个自己写的类或第三方jar包放q?JAVA_HOME/jre/lib/ext目录中,那么它将被Bootstrap Classloader装蝲?/span></span></span></span></span></p> <li> <p><strong><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: 微Y雅黑"><span style="font-family: q圆"><span style="font-size: 10pt">System Classloader</span></span></span></span></span></strong></p> <p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: 微Y雅黑"><span style="font-family: q圆"><span style="font-size: 10pt">System Classloader通常负责装蝲pȝ环境变量CLASSPATH中设|的cR由System Classloader装蝲的类对于Apusic服务器内部的cd部v在Apusic服务器上的J2EE应用Q通常打包成earQ都是可见的?APUSIC_HOME%/lib目录下的jar文g是Apusic应用服务器的核心c,一般把q些jar文g都加在系lCLASSPATH中。另外,一些公用类也可以加在系lCLASSPATH中,如JDBC驱动E序{?/span></span></span></span></span></p> </li> </ul> <br /> <span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: 微Y雅黑"><span style="font-family: q圆"><span style="font-size: 10pt"><strong>自定义Classloader<br /> </strong>        在编写应用代码的时候,常常有需要动态加载类和资源,比如昑ּ的调用classLoader.loadClass(“ClassName”)Q?span style="color: red">虽然直接使用ClassLoader.getSystemClassLoader()Q可以得到SystemlassLoader来完成这Q务。但是,׃System Classloader是JVM创徏的ClassloaderQ它的职责有限,只适合于普通的java应用E序Q在很多复杂场景中不能满需求,比如在应用服务器中?/span>q时候就需要自行实C个Classloader的子c,实现特定的行为。Apusic应用服务器中定义了若干个特有的ClassloaderQ负责装载部|在Apusic中的JavaEE应用中的c,q里q不试图Lq如何实C个自定义的Classloader.<br /> <br /> </span></span></span></span></span><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: 微Y雅黑"><span style="font-family: q圆"><span style="font-size: 10pt"><strong>Caller Classloader和线E上下文Classloader<br /> </strong>        动态加载资源时Q往往有三UClassloader可选择Q?strong>System Classloader</strong>?strong>Caller Classloader</strong>?strong>当前U程的上下文Classloader</strong>。System Classloader前面已经描述q了Q下面我们看看什么是Caller Classloader、当前线E的上下文Classloader?br />          </span></span></span></span></span> <p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: 微Y雅黑"><span style="font-family: q圆"><span style="font-size: 10pt">     <u><em>   Caller Classloader</em></u></span></span></span></span></span></p> <p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: 微Y雅黑"><span style="font-family: q圆"><span style="font-size: 10pt">        Caller Classloader指的是当前所在的c装载时使用的ClassloaderQ它可能是System ClassloaderQ也可能是一个自定义的ClassloaderQ这里,我们都称之ؓCaller Classloader。我们可以通过getClass().getClassLoader()来得到Caller Classloader。例如,存在Ac,是被AClassLoader所加蝲QA.class.getClassLoader()为AClassLoader的实例,它就是A.class的Caller Classloader?/span></span></span></span></span></p> <p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: 微Y雅黑"><span style="font-family: q圆"><span style="font-size: 10pt">        如果在AcM使用new关键字,或者Class.forName(String className)和Class.getResource(String resourceName)ҎQ那么这时也是用Caller Classloader来装载类和资源。比如在AcM初始化Bc:<br /> <br /> /**<br />   * A.java<br /> */<br /> ...<br /> public void foo() {<br />     B b = new B();<br />     b.setName("b");<br /> }<br />         那么QBcȝ当前ClassloaderQ也是AClassloader装蝲。同LQ修改上q的fooҎQ其实现改ؓQ?/span></span></span></span></span></p> <span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: 微Y雅黑"><span style="font-family: q圆"><span style="font-size: 10pt">        Class clazz = Class.forName("foo.B");<br /> </span></span></span></span></span> <p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: 微Y雅黑"><span style="font-family: q圆"><span style="font-size: 10pt">最l获取到的clazzQ也是由AClassLoader所装蝲?/span></span></span></span></span></p> <p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: 微Y雅黑"><span style="font-family: q圆"><span style="font-size: 10pt">        那么Q如何用指定的Classloaderd成类和资源的装蝲呢?或者说Q当需要去实例化一个Caller Classloader和它的父Classloader都不能装载的cLQ怎么办呢Q?/span></span></span></span></span></p> <p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: 微Y雅黑"><span style="font-family: q圆"><span style="font-size: 10pt">        一个很典型的例子是JAXPQ当使用xerces的SAX实现Ӟ我们首先需要通过rt.jar中的javax.xml.parsers.SAXParserFactory.getInstance()得到xercesImpl.jar中的org.apache.xerces.jaxp.SAXParserFactoryImpl的实例。由于JAXP的框架接口的class位于JAVA_HOME/lib/rt.jar中,由Bootstrap Classloader装蝲Q处于Classloader层次l构中的最层Q而xercesImpl.jar׃层的Classloader装蝲Q也是说SAXParserFactoryImpl是在SAXParserFactory中实例化的,如前所qͼ使用SAXParserFactory的Caller Classloader(q里是Bootstrap Classloader)是完成不了这个Q务的?/span></span></span></span></span></p> <p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: 微Y雅黑"><span style="font-family: q圆"><span style="font-size: 10pt">q时Q我们就需要了解一下线E上下文Classloader?br /> <br /> </span></span></span></span></span></p> <p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: 微Y雅黑"><span style="font-family: q圆"><span style="font-size: 10pt">       <u><em> U程上下文Classloader</em></u></span></span></span></span></span></p> <p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: 微Y雅黑"><span style="font-family: q圆"><span style="font-size: 10pt">每个U程都有一个关联的上下文Classloader。如果用new Thread()方式生成新的U程Q新U程承其父线E的上下文Classloader。如果程序对U程上下文Classloader没有M改动的话Q程序中所有的U程都使用System Classloader作ؓ上下文Classloader?/span></span></span></span></span></p> <p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: 微Y雅黑"><span style="font-family: q圆"><span style="font-size: 10pt">当用Thread.currentThread().setContextClassLoader(classloader)ӞU程上下文Classloader变成了指定的Classloader了。此Ӟ在本U程的Q意一处地方,调用Thread.currentThread().getContextClassLoader()Q都可以得到前面讄的Classloader?/span></span></span></span></span></p> <p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: 微Y雅黑"><span style="font-family: q圆"><span style="font-size: 10pt">回到JAXP的例子,假设xercesImpl.jar只有AClassLoader能装载,现在A.class内部要用JAXPQ但是A.class却不是由AClassLoader或者它的子Classloader装蝲的,那么在A.class中,应该q样写才能正得到xercesImpl的实玎ͼ</span></span></span></span></span></p> <span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: 微Y雅黑"><span style="font-family: q圆"><span style="font-size: 10pt">AClassLoader aClassLoader = new AClassLoader(parent);<br /> Thread.currentThread().setContextClassLoader(aClassLoader);<br /> SAXParserFactory factory = SAXParserFactory.getInstance();<br /> ...<br />         JAXPq时可以通过U程上下文Classloader装蝲xercesImpl的实现类了,当然Q还有一个前提是在配制文件或启动参数中指定了使用xerces作ؓJAXP的实现。下面是JAXP中的代码片断Q?br /> ClassLoader cl = Thread.currentThread().getContextClassLoader();<br /> …<br /> Class providerClass = cl.loadClass(className);<br /> …<br /> </span></span></span></span></span><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: 微Y雅黑"><span style="font-family: q圆"><span style="font-size: 10pt"><strong>JVM中类的唯一?br /> </strong>        JVM为每一个Classloaderl护一个唯一标识。在一个JVM里(对应一个Javaq程Q,可以׃同的Classloader装蝲多个同名的类Q指包名和类名都完全相同Q下同)Qؓ了唯一地标识被不同Classloader装蝲的类QJVM会在被装载的cd前加上装载该cȝClassloader的标识?/span></span></span></span></span> <img src ="http://www.aygfsteel.com/thisliy/aggbug/300528.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/thisliy/" target="_blank">liyang</a> 2009-10-31 23:20 <a href="http://www.aygfsteel.com/thisliy/archive/2009/10/31/300528.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PropertyChangeSupportc?/title><link>http://www.aygfsteel.com/thisliy/archive/2009/07/07/285832.html</link><dc:creator>liyang</dc:creator><author>liyang</author><pubDate>Tue, 07 Jul 2009 07:58:00 GMT</pubDate><guid>http://www.aygfsteel.com/thisliy/archive/2009/07/07/285832.html</guid><description><![CDATA[<span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-family: ">最q看代码一直碰到这个类Q先做一个ȝ?br /> <br /> 先看PropertyChangeSupportcȝ官方文档解释Q?br /> This is a utility class that can be used by beans that support bound properties. You can use an instance of this class as a member field of your bean and delegate various work to it.<br /> <br /> 1Q关联属?br /> 在JavaBean的设计中Q按照属性的不同作用又细分ؓ四类Q单值属性、烦引属性、关联属性、限制属性。关联属性,也称之ؓl定属性。绑定属性会在属性值发生变化时Q通知所有相关的监听器。ؓ了实C个绑定属性,必须实现两个机制?br /> 1Q? 无论何时Q只要属性的值发生变化,该bean必须发送一个PropertyChange事gl所有已注册的监听器?br /> 2Q? Z使监听器能够注册Qbean必须实现以下两个ҎQvoid addPropertyChangeListener(PropertyChangeListener listener);<br /> void removePropertyChangerListener(PropertyChangerListener listener);<br /> <br /> <br /> <br /> 2Q用PropertyChangeSupport理监听?br /> 可以通过java.bean包下的PropertyChangeSupportcL理监听器。要使用q个c,bean必须有一个此cȝ数据域。private PropertyChangeSupport listeners = new PropertyChangeSupport(this);<br /> <br /> <br /> q样可以添加和U除监听器的d交给q个对象。public void addPropertyChangeListener(PropertyChangeListener listener) {<br /> listeners.addPropertyChangeListener(listener);<br /> }<br /> <br /> public void removePropertyChangeListener(PropertyChangeListener listener) {<br /> listeners.removePropertyChangeListener(listener);<br /> }<br /> <br /> <br /> 当bean的属性发生变化时Q用PropertyChangeSupport对象的firePropertyChangeҎQ会一个事件发送给所有已l注册的监听器。该Ҏ有三个参敎ͼ属性的名字、旧的g及新的倹{属性的值必L对象Q如果是单数据类型,则必进行包装。listeners.firePropertyChange("ourString", oldString, newString);<br /> <br /> <br /> 所有注册的监听器实现PropertyChangeListener接口Q该接口中只有一个方法。public void propertyChange(PropertyChangeEvent e)<br /> <br /> 当bean的属性值发生变化时Q该Ҏ中的代码׃被触发。可以通过e.getOldValue();<br /> e.getNewValue();<br /> <br /> 来得到changes.firePropertyChange("ourString", oldString, newString);中的oldString和newString?br /> <br /> 3Qؓ什么要使用PropertyChangeSupport<br /> 使用q个cȝ理监听器的好处是Q它是线E安全的。如果用一个@环体来set Bean的属性,则这个类可以保证所有监听器执行触发事g的有序?br /> q有一个好处是Q这个类支持fire带烦引的属性改变事Ӟ详见java.bean.IndexedPropertyChangeEventQ。此时向注册的监听器发送一个PropertyChangeEvent的方法ؓQvoid fireIndexedPropertyChange(String PropertyName,int index,Object oldValue,Object newValue)<br /> <br /> <br /> 4Q实例代?<br /> <br /> public class SomeBean {<br /> <br /> private String property;<br /> <br /> private PropertyChangeSupport changeSupport;<br /> <br /> public void setProperty(String newValue) {<br /> <br /> String oldValue = property;<br /> <br /> property = newValue;<br /> <br /> changeSupport.firePropertyChange("property", oldValue, newValue);<br /> <br /> }<br /> <br /> public void addPropertyChangeListener(PropertyChangeListener l) {<br /> <br /> changeSupport.add(l);<br /> <br /> }<br /> <br /> public void removePropertyChangeListener(PropertyChangeListener l) {<br /> <br /> changeSupport.remove(l);<br /> <br /> }<br /> <br /> }</span></span><span style="font-family: "><br /> </span></span> <p><span style="font-size: 12pt"><span style="font-family: "><br /> </span></span></p> <p><span style="font-size: 12pt"><span>最q看代码一直碰到这个类Q先做一个ȝ?br /> <br /> 先看PropertyChangeSupportcȝ官方文档解释Q?br /> This is a utility class that can be used by beans that support bound properties. You can use an instance of this class as a member field of your bean and delegate various work to it.<br /> <br /> 1Q关联属?br /> 在JavaBean的设计中Q按照属性的不同作用又细分ؓ四类Q单值属性、烦引属性、关联属性、限制属性。关联属性,也称之ؓl定属性。绑定属性会在属性值发生变化时Q通知所有相关的监听器。ؓ了实C个绑定属性,必须实现两个机制?br /> 1Q? 无论何时Q只要属性的值发生变化,该bean必须发送一个PropertyChange事gl所有已注册的监听器?br /> 2Q? Z使监听器能够注册Qbean必须实现以下两个ҎQvoid addPropertyChangeListener(PropertyChangeListener listener);<br /> void removePropertyChangerListener(PropertyChangerListener listener);<br /> <br /> <br /> <br /> 2Q用PropertyChangeSupport理监听?br /> 可以通过java.bean包下的PropertyChangeSupportcL理监听器。要使用q个c,bean必须有一个此cȝ数据域。private PropertyChangeSupport listeners = new PropertyChangeSupport(this);<br /> <br /> <br /> q样可以添加和U除监听器的d交给q个对象。public void addPropertyChangeListener(PropertyChangeListener listener) {<br /> listeners.addPropertyChangeListener(listener);<br /> }<br /> <br /> public void removePropertyChangeListener(PropertyChangeListener listener) {<br /> listeners.removePropertyChangeListener(listener);<br /> }<br /> <br /> <br /> 当bean的属性发生变化时Q用PropertyChangeSupport对象的firePropertyChangeҎQ会一个事件发送给所有已l注册的监听器。该Ҏ有三个参敎ͼ属性的名字、旧的g及新的倹{属性的值必L对象Q如果是单数据类型,则必进行包装。listeners.firePropertyChange("ourString", oldString, newString);<br /> <br /> <br /> 所有注册的监听器实现PropertyChangeListener接口Q该接口中只有一个方法。public void propertyChange(PropertyChangeEvent e)<br /> <br /> 当bean的属性值发生变化时Q该Ҏ中的代码׃被触发。可以通过e.getOldValue();<br /> e.getNewValue();<br /> <br /> 来得到changes.firePropertyChange("ourString", oldString, newString);中的oldString和newString?br /> <br /> 3Qؓ什么要使用PropertyChangeSupport<br /> 使用q个cȝ理监听器的好处是Q它是线E安全的。如果用一个@环体来set Bean的属性,则这个类可以保证所有监听器执行触发事g的有序?br /> q有一个好处是Q这个类支持fire带烦引的属性改变事Ӟ详见java.bean.IndexedPropertyChangeEventQ。此时向注册的监听器发送一个PropertyChangeEvent的方法ؓQvoid fireIndexedPropertyChange(String PropertyName,int index,Object oldValue,Object newValue)<br /> <br /> <br /> 4Q实例代?<br /> <br /> public class SomeBean {<br /> <br /> private String property;<br /> <br /> private PropertyChangeSupport changeSupport;<br /> <br /> public void setProperty(String newValue) {<br /> <br /> String oldValue = property;<br /> <br /> property = newValue;<br /> <br /> changeSupport.firePropertyChange("property", oldValue, newValue);<br /> <br /> }<br /> <br /> public void addPropertyChangeListener(PropertyChangeListener l) {<br /> <br /> changeSupport.add(l);<br /> <br /> }<br /> <br /> public void removePropertyChangeListener(PropertyChangeListener l) {<br /> <br /> changeSupport.remove(l);<br /> <br /> }<br /> <br /> }</span></span></p> <p> </p> <p> </p> <p><span style="font-size: 12pt"><span>最q看代码一直碰到这个类Q先做一个ȝ?br /> </span></span><span style="font-size: 12pt"><span style><br /> 先看PropertyChangeSupportcȝ官方文档解释Q?br /> This is a utility class that can be used by beans that support bound properties. You can use an instance of this class as a member field of your bean and delegate various work to it.<br /> <br /> 1Q关联属?br /> 在JavaBean的设计中Q按照属性的不同作用又细分ؓ四类Q单值属性、烦引属性、关联属性、限制属性。关联属性,也称之ؓl定属性。绑定属性会在属性值发生变化时Q通知所有相关的监听器。ؓ了实C个绑定属性,必须实现两个机制?br /> 1Q? 无论何时Q只要属性的值发生变化,该bean必须发送一个PropertyChange事gl所有已注册的监听器?br /> 2Q? Z使监听器能够注册Qbean必须实现以下两个ҎQvoid addPropertyChangeListener(PropertyChangeListener listener);<br /> void removePropertyChangerListener(PropertyChangerListener listener);<br /> <br /> <br /> <br /> 2Q用PropertyChangeSupport理监听?br /> 可以通过java.bean包下的PropertyChangeSupportcL理监听器。要使用q个c,bean必须有一个此cȝ数据域。private PropertyChangeSupport listeners = new PropertyChangeSupport(this);<br /> <br /> <br /> q样可以添加和U除监听器的d交给q个对象。public void addPropertyChangeListener(PropertyChangeListener listener) {<br /> listeners.addPropertyChangeListener(listener);<br /> }<br /> <br /> public void removePropertyChangeListener(PropertyChangeListener listener) {<br /> listeners.removePropertyChangeListener(listener);<br /> }<br /> <br /> <br /> 当bean的属性发生变化时Q用PropertyChangeSupport对象的firePropertyChangeҎQ会一个事件发送给所有已l注册的监听器。该Ҏ有三个参敎ͼ属性的名字、旧的g及新的倹{属性的值必L对象Q如果是单数据类型,则必进行包装。listeners.firePropertyChange("ourString", oldString, newString);<br /> <br /> <br /> 所有注册的监听器实现PropertyChangeListener接口Q该接口中只有一个方法。public void propertyChange(PropertyChangeEvent e)<br /> <br /> 当bean的属性值发生变化时Q该Ҏ中的代码׃被触发。可以通过e.getOldValue();<br /> e.getNewValue();<br /> <br /> 来得到changes.firePropertyChange("ourString", oldString, newString);中的oldString和newString?br /> <br /> 3Qؓ什么要使用PropertyChangeSupport<br /> 使用q个cȝ理监听器的好处是Q它是线E安全的。如果用一个@环体来set Bean的属性,则这个类可以保证所有监听器执行触发事g的有序?br /> q有一个好处是Q这个类支持fire带烦引的属性改变事Ӟ详见java.bean.IndexedPropertyChangeEventQ。此时向注册的监听器发送一个PropertyChangeEvent的方法ؓQvoid fireIndexedPropertyChange(String PropertyName,int index,Object oldValue,Object newValue)<br /> <br /> <br /> 4Q实例代?<br /> <br /> public class SomeBean {<br /> <br /> private String property;<br /> <br /> private PropertyChangeSupport changeSupport;<br /> <br /> public void setProperty(String newValue) {<br /> <br /> String oldValue = property;<br /> <br /> property = newValue;<br /> <br /> changeSupport.firePropertyChange("property", oldValue, newValue);<br /> <br /> }<br /> <br /> public void addPropertyChangeListener(PropertyChangeListener l) {<br /> <br /> changeSupport.add(l);<br /> <br /> }<br /> <br /> public void removePropertyChangeListener(PropertyChangeListener l) {<br /> <br /> changeSupport.remove(l);<br /> <br /> }<br /> <br /> }<br /> <br /> <br /> </span></span></p> <span style="font-size: 12pt"><span style="font-family: "> </span></span> <img src ="http://www.aygfsteel.com/thisliy/aggbug/285832.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/thisliy/" target="_blank">liyang</a> 2009-07-07 15:58 <a href="http://www.aygfsteel.com/thisliy/archive/2009/07/07/285832.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">̩</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">պ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">½</a>| <a href="http://" target="_blank">մ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ֶ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Զ</a>| <a href="http://" target="_blank">⳵</a>| <a href="http://" target="_blank">ˮ</a>| <a href="http://" target="_blank">Ϫ</a>| <a href="http://" target="_blank">ʯ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">»</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">˷</a>| <a href="http://" target="_blank">޻</a>| <a href="http://" target="_blank">ˮ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ƽ</a>| <a href="http://" target="_blank">ԭ</a>| <a href="http://" target="_blank">Ӽ</a>| <a href="http://" target="_blank">ˮ</a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ѯ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƺ</a>| <a href="http://" target="_blank">㽭ʡ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ϫ</a>| <a href="http://" target="_blank"></a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>