锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
JS 鐨?123 涓?Java 鐨?int 鎴?Integer銆乴ong 闂寸殑杞崲
JS 鐨?"2009-06-23" 涓?Java 鐨?java.util.Date 涔嬮棿鐨勮漿鎹?br />
JS 鐨?"[1,2,3]" 涓?Java 鐨?int[] 闂寸殑杞崲
JS 鐨?"{id:123, name: 'Unmi'}" 涓?Java 鐨?Class Person{int id; String name} 闂寸殑杞崲
鎴栬呮洿澶嶆潅鐨勫祵濂楃被鍨? "{id:123, name: 'Unmi', blogs:['http://unmi.blogjava.net','http://blog.csdn.net/kypfos']}" ) 涓?Java 綾誨瀷闂寸殑杞崲錛岀瓑絳夈傞偅涔堣繖涓鍒囨槸鎬庝箞榪涜鐨勫憿錛熷叾瀹炴垜浠璇嗚繃寰堝緇勪歡鐨勭被鍨嬫槧灝勶紝濡?Java 鐨?PropertyEditor銆丠ibernate(UserType)銆乮Batis(TypeHandler) 鐨勭被鍨嬫槧灝勶紝Struts1/2 涓?Form/Model 鐢ㄧ殑 Converter 絳夈?br />
榪欓噷鎴戞潵紼嶇◢鍒嗘瀽 DWR 鐨?Converter 瀹炵幇錛屼互鍙婅鏄庡浣曞畾鍒惰嚜宸辯殑 Converter銆傛湰鏂囨墍鐢?DWR 鏄?2.0.5 鐗堛?br />
1. DWR 鍐呯疆鐨?Converter 鍙婂簲鐢ㄧ被鍨?/strong>
鍚嶇О
搴旂敤綾誨瀷
杞崲鍣?/strong>
null
void錛宩ava.lang.Void
NullConverter
enum
EnumConverter
primitive
boolean,byte,short,int,long,float,double,char,
java.lang.Boolean,java.lang.Byte,java.lang.Short,
java.lang.Integer,java.lang.Long,java.lang.Float,
java.lang.Double,java.lang.CharacterPrimitiveConverter
bignumber
java.math.BigInteger,java.math.BigDecimal
BigNumberConverter
string
java.lang.String
StringConverter
array
[Z,[B,[S,[I,[J,[F,[D,[C,[L*
ArrayConverter
map
java.util.Map
MapConverter
collection
java.util.Collection
CollectionConverter
date
java.util.Date,java.sql.Date,java.sql.Time,
java.sql.Timestamp,java.util.CalendarDateConverter
dom
org.w3c.dom.Node,org.w3c.dom.Element,org.w3c.dom.Document
DOMConverter
dom4j
org.dom4j.Document,org.dom4j.Element,org.dom4j.Node
DOM4JConverter
jdom
org.jdom.Document,org.jdom.Element
JDOMConverter
xom
nu.xom.Document,nu.xom.Element,nu.xom.Node
XOMConverter
servlet
javax.servlet.ServletConfig,javax.servlet.ServletContext,
javax.servlet.http.HttpServletRequest,
javax.servlet.http.HttpServletResponse,
javax.servlet.http.HttpSessionServletConverter
bean
BeanConverter
object
ObjectConverter
hibernate2
H2BeanConverter
hibernate3
H3BeanConverter
url
java.net.URL
URLConverter
exception
ExceptionConverter
miniException
java.lang.Throwable
MinimalistExceptionConverter
瀹冧滑鏄簲鐢ㄥ惎鍔ㄧ殑鏃跺欙紝閫氳繃 org.directwebremoting.servlet.DwrServlet 鍒濆鍖?dwr-2.0.5.jar!/org/directwebremoting/dwr.xml 鏂囦歡鍔犺澆榪涙潵鐨勩備緥濡傦細
<converter id="date" class="org.directwebremoting.convert.DateConverter"/>銆娉ㄥ唽浜?date 杞崲鍣?br />
<convert converter="date" match="java.util.Date"/>銆搴旂敤娉ㄥ唽鐨?date 杞崲鍣ㄥ簲鐢ㄥ埌 java.util.Date 綾誨瀷
鐪嬪埌涓婇潰錛屼綘涔熻浼氭儕璁朵竴涓嬶紝鎴戜滑騫蟲椂鍙兘涔熷氨鐢ㄤ笅 bean 杞崲鍣紝鍏朵粬鐢ㄥ唴緗氨琛屻傜劧鑰?DWR 紜負鎴戜滑鑰冭檻鐨勫緢鍛ㄥ埌鐨勶紝鍖呮嫭 hibernate 鐩稿叧鐨勶紝URL銆丼ervlet銆丏om 絳夌浉鍏崇被鍨嬬殑杞崲鍣ㄣ?br />
2. DWR 濡備綍紜畾鐢ㄥ摢涓?Converter?
DWR 鏄牴鎹柟娉曞弬鏁版潵紜畾鍏ュ彛鍙傛暟鐨?Converter銆佹牴鎹繑鍥炲肩被鍨嬬‘瀹氫紶鍚?JS 鐨勫嚭鍙e弬鏁扮殑 Converter銆傛諱箣鏄互 Java 鏂規硶鍘熷瀷涓哄熀鍑嗘潵鍐沖畾姣忎竴鍙傛暟鎴栬繑鍥炲煎悇鑷敤鍝釜 Converter 鏉ヨ漿鎹㈡暟鎹?br />
鍦?BaseCallMarshaller.marshallInbound(HttpServletRequest request, HttpServletResponse response) 鏂規硶涓紝浣跨敤
Class paramType = method.getParameterTypes()[j] 鏉ヨ幏寰楀弬鏁扮殑綾誨瀷錛岀劧鍚庝粠宸插姞杞界殑 Converter Map 涓壘鍒?Converter 鍚嶇О錛岃繘鑰岀‘瀹?Converter 綾誨悕銆?/p>
鑰岀‘瀹氳繑鍥炲肩被鍨嬪氨涓嶆槸鐩存帴鐢ㄥ弽灝勭殑 method.getReturnType()銆傝屾槸浠ュ弽灝勬柟寮忚皟鐢ㄦ柟娉曞悗錛屾牴鎹叿浣撹繑鍥炲肩殑綾誨瀷鏉ョ‘瀹氱殑銆傝錛?br />
Replay DefaultRemoter.execute(Call) 鏂規硶涓殑
Object reply = chain.doFilter(object, method, call.getParameters());銆鍐嶈繘鍏ュ埌
Object ExecuteAjaxFilter.doFilter(Object obj, Method method, Object[] params Ajax FilterChain){
return method.invoke(obj, params);
}
灝辨槸鏍規嵁涓婇潰鐨勮繑鍥炲鹼紝鐒跺悗鍦?br />
DefaultConverterManager.convertOutbound(Object, OutboundContext) 鏂規硶涓殑
Converter converter = getConverter(object); 銆//鏍規嵁榪斿洖鍊?object 紜畾璇ョ敤鐨?Converter銆?br />
3. DWR Converter 鐨勮皟鐢?/strong>
澶氱暀鎰忎笅 DWR 鑷甫鐨?Converter錛屽彲浠ョ湅鍒版墍鏈夌殑 Converter 鐩存帴鎴栫畝鎺ョ殑 extends BaseV20Converter implements Converter錛屽叾瀹?BaseV20Converter(DWR 1.x 涓搴斾負 BaseV10Converter) 鏈韓灝卞疄鐜頒簡 Converter銆傚湪 BaseV20Converter 鎶借薄綾諱腑榛樿瀹炵幇浜?Converter 鐨勬柟娉?br />
public void setConverterManager(ConverterManager config) { }
鍏蜂綋鐨?Converter 鍙涓撳績鍘誨疄鐜版帴鍙?Converter 涓殑鍙︿袱涓柟娉?
Object convertInbound(Class paramType, InboundVariable data, InboundContext inctx) throws MarshallException;
OutboundVariable convertOutbound(Object data, OutboundContext outctx) throws MarshallException;
榪愯鏃訛紝瀹冧滑鐩稿簲鐨勮 ConvertManager(榛樿涓?DefaultConvertManager) 鐨?br />
Object convertInbound(Class paramType, InboundVariable iv, InboundContext inctx, TypeHintContext incc) throws MarshallException
OutboundVariable convertOutbound(Object object, OutboundContext outctx) throws MarshallException
鏉ヨ皟鐢ㄣ?br />
DWR 瀵規瘡涓弬鏁版垨榪斿洖鍊艱嚦灝戜細搴旂敤涓嬈?Converter錛屼絾瀵逛簬澶嶆潅鐨勭被鍨嬩細閫掑綊鐨勮皟鐢?Converter錛屾瘮濡傦紝瑕佸畬鎴?br />
JS "{id:123, name: 'Unmi', blogs:['http://unmi.blogjava.net','http://blog.csdn.net/kypfos']}" 鍒?Java 鐨?Person{int id, String name, String[] blogs;} 鐨勮漿鎹紝灝變細浣跨敤鍒?bean->primitive->array 涓変釜 Converter銆?br />
4. 瀹氬埗鑷繁鐨?Converter
鍩烘湰涓?DWR 鍐呯疆鐨?Converter 灝卞鐢ㄧ殑錛屼絾涔熸湁鍙兘闇瑕佸畾瀹氳嚜宸辯殑 Converter銆備粠 DWR 鐨?Converter 瀹炵幇鏉ョ湅錛屼竴鑸細鐢ㄤ袱縐嶆柟寮忥細
1) extends BaseV20Converter implements Converter錛屽疄鐜?Converter 鐨?converterInbound() 鍜?converterOutbound() 鏂規硶
2) extends BasicObjectConverter implements Converter錛屾垨緇ф壙 BeanConverter錛屽疄鐜?BasicObjectConverter 鐨?getPropertyMapFromObject()錛実etPropertyMapFromObject() 鍜?createTypeHintContext() 鏂規硶銆?br />
鍓嶄竴縐嶆柟寮忥紝璇峰弬鐓?org.directwebremoting.convert.DateConverter 鐨勬簮鐮佸疄鐜幫細
convertInbound() 鐢?JS 鐨勫瓧絎︿覆杞崲鎴愯姹傜殑 Date銆乀ime銆乀imestamp 鎴?Calender 瀵瑰儚銆?br />
convertOubound() 鎶?Java 鐨勭被鍨嬭漿鎹㈡垚 JS 鐨?new Date() 綾誨瀷錛屾敞鎰忚繑鍥炲肩殑鍐欐硶錛?br />
return new SimpleOutboundVariable("new Date(" + millis + ")", outctx, true);
絎簩縐嶇戶鎵?BasicObjectConverter 鎴栨槸 BeanConverter 鐨勫仛娉曪紝鍙弬鑰?BeanConverter 鐨勬簮鐮佸疄鐜般傝〃鐜板湪 JSON 鍜?Java 瀵硅薄闂寸殑杞崲錛岃鏄紩鍏ヨВ鏋?JSON 鐨?JAR 鍖呮垨璁歌兘鏈変笉灝戝府鍔┿?br />
瀹氬埗 Converter 鐨勫唴瀹硅鐨勫緢灝戯紝涓昏鏄湡鏈夎繖鏂歸潰鐨勯渶瑕佺殑鏃跺欒鍙傝?DWR 鐨勭浉鍏蟲簮鐮侊紝瀹為檯涓悊瑙e悇涓帴鍙f柟娉曞弬鏁扮殑鎰忎箟錛屽強榪斿洖鍊肩殑瑕佹眰銆傚寰呭紑婧愮粍浠惰繕鏄淇濇寔闃呰婧愮爜鐨勫ソ涔犳儻銆?br />
濂藉暒錛岃嚜宸辯殑 Converter 鍐欏ソ錛岄渶瑕佹敞鍐岋紝闇瑕佸簲鐢ㄣ傛垜浠繕鏄弬鑰?DWR 鐨勫仛娉曪紝鍐欏湪鑷繁鐨?dwr.xml 涓備緥濡傚畾鍒朵簡 com.unmi.dwr.converter.SpecialConverter錛岃瀵?com.unmi.model.SpecialObject 榪涜鍑哄叆綾誨瀷鐨勮漿鎹紝灝辮繖涔堝啓錛?br />
<converter id="special" class="com.unmi.dwr.converter.SpecialConverter"/>銆娉ㄥ唽浜?nbsp;special 杞崲鍣?br />
<convert converter="special" match="com.unmi.model.SpecialObject"/>銆搴旂敤娉ㄥ唽鐨?special 杞崲鍣ㄥ簲鐢ㄥ埌 com.unmi.model.SpecialObject 綾誨瀷
5. 灝忕粨
鐢?DWR 鍏跺疄涔熸湁孌墊椂鏃ヤ簡錛屾湭鏇劇郴緇熺殑瀛︼紝鎬繪槸閬囦竴闂銆佹壂闄や竴涓紝涓嶅厤涔熶細鍘繪壘鎵劇浉鍏蟲洿緋葷粺鐨勮祫鏂欍傜劧鑰岀潃涓嬫綃囩殑鍔ㄦ満鏄笂鍛ㄥ叚鍦ㄤ功鍩庣炕浜嗕笅 銆?DWR 瀹炴垬銆嬶紝瀹冨疄闄呰 DWR 鏈韓鐨勮緝灝戙傛渶鍚庢垜絎竴涓兂浜嗚В浜嗘槸 DWR 鑳藉畬鎴?JS 涓?Java 闂翠粈涔堢被鍨嬬殑杞崲錛岀涓鎵嬬殑璧勬枡緗戜笂涔熸病鎼滅儲鍒幫紝浜庢槸榪涘埌婧愮爜涓幓錛屼翰韜巻緇冿紝涔熸洿鍔犳繁浜嗗嵃璞°?br />
璇昏呬篃璁稿拰鎴戜竴鏍風洰鐨勶紝鍙兂鐪嬬湅鍐呯疆鐨勮漿鎹㈠櫒鏈夊摢浜涳紝鑳借漿鎹㈠摢浜涚被鍨嬶紝閭e氨鍙渶鐪嬫渶涓烘姠鐪肩殑閭e紶琛ㄦ牸鍚с傞渶瑕佸畾鍒?Converter 搴旇寰堝皯錛屽氨鍍忔垜浠緢灝戝畾鍒?Struts 鐨?Converter銆丠ibernate 鐨?UserType 鍜?iBatis 鐨?TypeHandler 涓鏍楓傚洜姝や篃灝卞瀹氬埗 DWR 鐨?Converter 鎵鐢ㄧ瘒騫呬笉澶氥?br />
瀵瑰緟寮婧愶紝鑷繁鎬繪湁涓範鎯氨鏄繀欏繪湁鐩稿叧鐨勬簮浠g爜浼撮殢鍦ㄥ畠韜竟銆傚紑婧愮粍浠剁殑浣跨敤涓鑸笉闅撅紝紕板埌闂錛屾棦鐒舵簮鐮侀兘鎺屾彙浜嗭紝鎴戞兂鎬昏兘浠庢簮鐮佷腑鎵懼嚭鍘熷洜鏉ャ傚皻涓旓紝瀵硅繖鏍風殑鐭ュ悕緇勪歡瓚婂彂娣卞叆錛屽氨鏇磋兘鍤煎嚭璁稿鍛沖銆?br />
鍙傝冿細DWR 2.0.5 鐨勬簮浠g爜錛屽 DWR 欏圭洰榪涜鍗曟璋冭瘯
鍘熸枃錛?a href="http://www.tkk7.com/Unmi/archive/2009/06/23/283741.html">http://www.tkk7.com/Unmi/archive/2009/06/23/283741.html
Cache鏄竴縐嶇敤浜?span style="color: red">鎻愰珮緋葷粺鍝嶅簲閫熷害銆?span style="color: red">鏀瑰杽緋葷粺榪愯鎬ц兘鐨勬妧鏈傚挨鍏舵槸鍦?/span>Web搴旂敤涓紝閫氳繃緙撳瓨欏甸潰鐨勮緭鍑虹粨鏋滐紝鍙互寰堟樉钁楃殑鏀瑰杽緋葷粺榪愯鎬ц兘銆?/span>
OSCache鏍囪搴撶敱OpenSymphony璁捐錛屽畠鏄竴縐嶅紑鍒涙х殑緙撳瓨鏂規錛屽畠鎻愪緵浜嗗湪鐜版湁JSP欏甸潰涔嬪唴瀹炵幇鍐呭瓨緙撳瓨鐨勫姛鑳姐侽SCache鏄釜涓涓騫挎硾閲囩敤鐨勯珮鎬ц兘鐨凧2EE緙撳瓨妗嗘灦錛孫SCache榪樿兘搴旂敤浜庝換浣旿ava搴旂敤紼嬪簭鐨勬櫘閫氱殑緙撳瓨瑙e喅鏂規銆?/span>
1 The init() method (which the developer can override) is called only once in a servlet’s life, and always before the servlet can service any client requests.
2 The init() method gives the servlet access to the Serv-letConf g and ServletContext objects, which the servlet needs to get information about the servlet conf guration and the web app.
3 The Container ends a servlet’s life by calling its destroy() method.
4 Most of a servlet’s life is spent running a service() method for a client request.
5 Every request to a servlet runs in a separate thread! There is only one instance of any particular servlet class.
6 Your servlet will almost always extend javax.servlet.http.HttpServlet, from which it inherits an implementation of the service() method that takes an HttpServletRequest and an HttpServletResponse.
7 HttpServlet extends javax.servlet.GenericServlet鈥攁n abstract class that implements most of the basic servlet methods.
8 GenericServlet implements the Servlet interface.
9 Servlet classes (except those related to JSPs) are in one of two packages: javax.servlet or javax.servlet.http.
10 You can override the init() method, and you must override at least one service method (doGet(), doPost(), etc.)
The HttpServlet’s doGet() and doPost() methods take an HttpServletRequest and an HttpServletResponse.
1 The service() method determines whether doGet() or doPost() runs based on the HTTP Method (GET, POST, etc.) of the HTTP request.
2 POST requests have a body; GET requests do not, although GET requests can have request parameters appended to the request URL (sometimes called “the query string”).
3 GET requests are inherently (according to the HTTP spec) idempotent. They should be able to run multiple times without causing any side effects on the server. GET requests shouldn’t change anything on the server. But you could write a bad, non-idempotent doGet() method.
4 POST is inherently not idempotent, so it’s up to you to design and code your app in such a way that if the client sends a request twice by mistake, you can handle it.
5 If an HTML form does not explicitly say “method=POST”, the request is sent as a GET, not a POST. If you do not have a doGet() in your servlet, the request will fail.
6 You can get parameters from the request with the getParameter(“paramname”) method. The return value is always a String.
7 If you have multiple parameter values for a given param-eter name, use the getParameterValues(“paramname”) method that returns a String array.
8 You can get other things from the request object including headers, cookies, a session, the query string, and an input stream
Post涓嶨et鍖哄埆錛?br />
1. Get鐢ㄤ簬浠庢湇鍔$鑾峰彇鏁版嵁錛孭ost鐢ㄤ簬鍚戞湇鍔″櫒绔彁浜ゆ暟鎹紱
2. Get鎻愪氦鍚庯紝鍙傛暟淇濈暀鍦ㄦ祻瑙堝櫒鍦板潃鏍忥紝Post涓嶄細錛?br />
3. Get鎻愪氦鏃訛紝URL浼氬甫鍙傛暟錛孭ost涓嶄細銆傚洜涓篣RL鏄繚瀛樺埌http鍗忚澶撮儴銆傝孭ost鍙傛暟淇濆瓨鍒癶ttp鍗忚Body涓?br />
4. Get瀹規槗浜х敓閲嶅鎻愪氦錛孭ost涓嶄細銆?br />
You use the Response to send data back to the client.
1 The most common methods you’ll call on the response object (HttpServletResponse) are setContentType() and getWriter().
2 Be careful鈥攎any developers assume the method is getPrintWriter(), but it’s getWriter().
3 The getWriter() method lets you do character I/O to write HTML (or something else) to the stream.
4 You can also use the response to set headers, send errors, and add cookies.
5 In the real world, you’ll probably use a JSP to send most HTML responses, but you may still use a response stream to send binary data
(like a JAR f le, perhaps) to the client.
6 The method you call on your response for getting a binary stream is getOutputStream().
7 The setContentType() method tells the browser how to handle the data coming in with the response. Typical content types are “text/html”, “application/pdf”, and “image/jpeg”.
8 You don’t have to memorize content types (also known as MIME types).
9 You can set response headers using addHeader() or setHeader(). The difference depends on whether the header is already part of the response. If it is, setHeader() will replace the value, but addHeader will add an additional value to the existing response. If the header is not already part of the response, then setHeader() and addHeader() behave in exactly the same way.
10 If you don’t want to respond to a request, you can redirect the request to a different URL. The browser takes care of sending the new request to the URL you provide.
11 To redirect a request, call sendRedirect(aStringURL) on the response.
12 You cannot call sendRedirect() after the response is committed! In other words, if you’ve already written something to the stream, it’s too late to do a redirect.
13 A request redirect is different from a request dispatch. A request dispatch (covered more in another chapter) happens on the server, while a redirect happens on the client. A request dispatch hands the request to another component on the server, usually within the same web app. A request redirect simply tells the browser to go a different URL
java -noverify -javaagent:C:\libraries\javarebel.jar -Drebel.dirs=c:\workspace\project\classes
Drebel.dirs鎸囧悜宸ョ▼涓?class鏂囦歡鐨勭洰褰曪紝涓嶅繀鎸囧畾鍏蜂綋鐨勭被鍚嶃傚彟澶栵紝javarebel.jar鐨勫悕瀛椾笉鑳戒慨鏀廣?/code>
鍦∕yeclipse涓嬌鐢細
window-preference-Tomcat 6.x-JDK-Optional JDK arguments涓嬭緗涓嬶細
CVS鏈嶅姟鍣ㄧ錛?br />
CVS 涓嬭澆錛歨ttp://www.march-hare.com/cvspro/
CVS 涓嬭澆鍦板潃錛?/font>http://www.cvshome.org/ (鏈鏂扮増鏈細hp:1.12.11,Linux and win32:1.11.17)
cvsnt 涓嬭澆鍦板潃錛?/font>http://www.cvsnt.com/cvspro/ (鏈鏂扮増鏈細2.0.58d)
CVS瀹㈡埛绔細
TortoiseCVS 涓嬭澆鍦板潃錛?/font>http://www.tortoisecvs.org/ (鏈鏂扮増鏈細1.8.11)
wincvs 涓嬭澆鍦板潃錛?/font>http://cvsgui.sourceforge.net/download.html (鏈鏂扮増鏈細1.3.20.3)
Python 涓嬭澆鍦板潃錛?/font>http://www.python.org/download/ (鏈鏂扮増鏈細2.4)
TCL 涓嬭澆鍦板潃錛?/font>http://www.activestate.com/Products/ActiveTCL/ (鏈鏂扮増鏈細8.4.9.0)
SmartCVS 涓嬭澆鍦板潃錛?/font>http://www.regnis.de/download.html (鏈鏂扮増鏈細3.0.6)
CVSWEB 涓嬭澆鍦板潃錛?/font>http://www.freebsd.org/projects/cvsweb.html (鏈鏂扮増鏈細3.0.5)
viewcvs 涓嬭澆鍦板潃錛?/font>http://viewcvs.sourceforge.net/(鏈鏂扮増鏈細0.9.2)
CvsGraph 涓嬭澆鍦板潃錛?/font>http://www.akhphd.au.dk/~bertho/cvsgraph/(鏈鏂扮増鏈?1.5.1)
緙洪櫡璺熻釜錛?br /> CVSTrac 涓嬭澆鍦板潃錛?/font>http://www.cnpack.org/ (http://www.cvstrac.org/)(鏈鏂扮増鏈細1.1.5)
鍩轟簬CVS鐨勪唬鐮佺粺璁″伐鍏鳳細鎸変唬鐮侀噺錛屾寜寮鍙戣呯殑緇熻琛ㄧ瓑錛?br />
StatCVS 涓嬭澆鍦板潃錛?/font>http://sourceforge.net/projects/statcvs (鏈鏂扮増鏈細0.2.2)
CVS鏉冮檺綆$悊錛圕VSACL is a patch for CVS錛夛細
cvsacl 涓嬭澆鍦板潃錛?/font>http://cvsacl.sourceforge.net/(鏈鏂扮増鏈細1.2.2)
subversion鏈嶅姟鍣ㄧ錛?br /> subversion 涓嬭澆鍦板潃錛?/font>http://subversion.tigris.org/project_packages.html#binary-packages (鏈鏂扮増鏈細1.3.2)
subversion瀹㈡埛绔細
tortoisesvn 涓嬭澆鍦板潃錛?/font>http://tortoisesvn.tigris.org/ (鏈鏂扮増鏈細1.4.0)
rapidsvn 涓嬭澆鍦板潃錛?/font>http://rapidsvn.tigris.org/ (鏈鏂扮増鏈細0.9.3)
鍦ㄨ〃杈懼紡涓湁鐗規畩鎰忎箟錛岄渶瑕佹坊鍔?""" 鎵嶈兘鍖歸厤璇ュ瓧絎︽湰韜殑瀛楃姹囨?/span>
瀛楃 |
璇存槑 |
^ |
鍖歸厤杈撳叆瀛楃涓茬殑寮濮嬩綅緗傝鍖歸厤 "^" 瀛楃鏈韓錛岃浣跨敤 ""^" |
$ |
鍖歸厤杈撳叆瀛楃涓茬殑緇撳熬浣嶇疆銆傝鍖歸厤 "$" 瀛楃鏈韓錛岃浣跨敤 ""$" |
( ) |
鏍囪涓涓瓙琛ㄨ揪寮忕殑寮濮嬪拰緇撴潫浣嶇疆銆傝鍖歸厤灝忔嫭鍙鳳紝璇蜂嬌鐢?""(" 鍜?"")" |
[ ] |
鐢ㄦ潵鑷畾涔夎兘澶熷尮閰?'澶氱瀛楃' 鐨勮〃杈懼紡銆傝鍖歸厤涓嫭鍙鳳紝璇蜂嬌鐢?""[" 鍜?""]" |
{ } |
淇グ鍖歸厤嬈℃暟鐨勭鍙楓傝鍖歸厤澶ф嫭鍙鳳紝璇蜂嬌鐢?""{" 鍜?""}" |
. |
鍖歸厤闄や簡鎹㈣絎︼紙"n錛変互澶栫殑浠繪剰涓涓瓧絎︺傝鍖歸厤灝忔暟鐐規湰韜紝璇蜂嬌鐢?""." |
? |
淇グ鍖歸厤嬈℃暟涓?0 嬈℃垨 1 嬈°傝鍖歸厤 "?" 瀛楃鏈韓錛岃浣跨敤 ""?" |
+ |
淇グ鍖歸厤嬈℃暟涓鴻嚦灝?1 嬈°傝鍖歸厤 "+" 瀛楃鏈韓錛岃浣跨敤 ""+" |
* |
淇グ鍖歸厤嬈℃暟涓?0 嬈℃垨浠繪剰嬈°傝鍖歸厤 "*" 瀛楃鏈韓錛岃浣跨敤 ""*" |
| |
宸﹀彸涓よ竟琛ㄨ揪寮忎箣闂?"鎴? 鍏崇郴銆傚尮閰?"|" 鏈韓錛岃浣跨敤 ""|" |
regex1 result:
regex2 result
regex3 result
{.}鐨勭敤娉?br />
綾誨姞杞藉櫒
Java涓被鐨勬煡鎵句笌瑁呰澆鍑虹幇鐨勯棶棰樻繪槸浼氭椂涓嶆椂鍑虹幇鍦?/span>Java紼嬪簭鍛橀潰鍓嶏紝榪欏茍涓嶆槸浠涔堜涪鑴哥殑浜嬫儏錛岀浉淇℃病鏈変竴涓?/span>Java紼嬪簭鍛樻病閬囧埌榪?/span>ClassNotException,鍥犳涓嶈涓鴻浜虹瀰瑙佽嚜宸變篃鐘繖鏍風殑閿欒鑰岃寰椾笉鑷劧錛屼絾鏄湪濡傛灉鍑虹幇浜?/span>ClassNotFoundException鍚庡紓甯稿悗涓鑴哥殑鑼劧錛岄偅鎴戞兂浣犺浜嗚В涓涓?/span>java鐨勭被瑁呰澆鐨勪綋鍒朵簡錛屽悓鏃朵負浜嗚繘琛屼笅闈㈢殑鍏充簬綾昏杞藉櫒涔嬮棿鐨勯殧紱繪х殑璁ㄨ錛屾垜浠厛綆鍗曚粙緇嶄竴涓嬬被瑁呰澆鐨勪綋緋葷粨鏋勩?/span>
1. Java綾昏杞戒綋緋葷粨鏋?/span>
瑁呰澆綾葷殑榪囩▼闈炲父綆鍗曪細鏌ユ壘綾繪墍鍦ㄤ綅緗紝騫跺皢鎵懼埌鐨?/span>Java綾葷殑瀛楄妭鐮佽鍏ュ唴瀛橈紝鐢熸垚瀵瑰簲鐨?/span>Class瀵硅薄銆?/span>Java鐨勭被瑁呰澆鍣ㄤ笓闂ㄧ敤鏉ュ疄鐜拌繖鏍風殑榪囩▼錛?/span>JVM騫朵笉姝㈡湁涓涓被瑁呰澆鍣紝浜嬪疄涓婏紝濡傛灉浣犳効鎰忕殑璇濓紝浣犲彲浠ヨJVM鎷ユ湁鏃犳暟涓被瑁呰澆鍣紝褰撶劧榪欓櫎浜嗘祴璇?/span>JVM澶栵紝鎴戞兂涓嶅嚭榪樻湁鍏朵粬鐨勭敤閫斻備綘搴旇宸茬粡鍙戠幇鍒頒簡榪欐牱涓涓棶棰橈紝綾昏杞藉櫒鑷韓涔熸槸涓涓被錛屽畠涔熼渶瑕佽瑁呰澆鍒板唴瀛樹腑鏉ワ紝閭d箞榪欎簺綾昏杞藉櫒鐢辮皝鏉ヨ杞藉憿錛屾誨緱鏈変釜鏍瑰惂錛熸病閿欙紝紜疄瀛樺湪榪欐牱鐨勬牴錛屽畠灝辨槸紲為緳瑙侀涓嶈灝劇殑Bootstrap ClassLoader. 涓轟粈涔堣瀹冪榫欒棣栦笉瑙佸熬鍛紝鍥犱負浣犳牴鏈棤娉曞湪Java浠g爜涓姄浣忓摢鎬曟槸瀹冪殑涓鐐圭偣鐨勫熬宸達紝灝界浣犺兘鏃舵椂鍒誨埢浣撲細鍒板畠鐨勫瓨鍦紝鍥犱負java鐨勮繍琛岀幆澧冩墍闇瑕佺殑鎵鏈夌被搴擄紝閮界敱瀹冩潵瑁呰澆錛岃屽畠鏈韓鏄?/span>C++鍐欑殑紼嬪簭錛屽彲浠ョ嫭绔嬭繍琛?/span>,鍙互璇存槸JVM鐨勮繍琛岃搗鐐?/span>,浼熷ぇ鍚с傚湪Bootstrap瀹屾垚瀹冪殑浠誨姟鍚庯紝浼氱敓鎴愪竴涓?/span>AppClassLoader(瀹為檯涓婁箣鍓嶇郴緇熻繕浼氫嬌鐢ㄦ墿灞曠被瑁呰澆鍣?/span>ExtClassLoader錛屽畠鐢ㄤ簬瑁呰澆Java榪愯鐜鎵╁睍鍖呬腑鐨勭被),榪欎釜綾昏杞藉櫒鎵嶆槸鎴戜滑緇忓父浣跨敤鐨勶紝鍙互璋冪敤ClassLoader.getSystemClassLoader() 鏉ヨ幏寰楋紝鎴戜滑鍋囧畾紼嬪簭涓病鏈変嬌鐢ㄧ被瑁呰澆鍣ㄧ浉鍏蟲搷浣滆瀹氭垨鑰呰嚜瀹氫箟鏂扮殑綾昏杞藉櫒錛岄偅涔堟垜浠紪鍐欑殑鎵鏈?/span>java綾婚氶氫細鐢卞畠鏉ヨ杞斤紝鍊煎緱灝婃暚鍚с?/span>AppClassLoader鏌ユ壘綾葷殑鍖哄煙灝辨槸鑰崇啛鑳借鐨?/span>Classpath錛屼篃鏄垵瀛﹁呭繀欏昏法榪囩殑闂ㄦ錛屾湁娌℃湁鐏靛厜涓闂殑鎰熻錛屾垜浠寜鐓у畠鐨勭被鏌ユ壘鑼冨洿緇欏畠鍙栧悕涓虹被璺緞綾昏杞藉櫒銆傝繕鏄厛鍓嶅亣瀹氱殑鎯呭喌錛屽綋Java涓嚭鐜版柊鐨勭被錛?/span>AppClassLoader棣栧厛鍦ㄧ被浼犻掔粰瀹冪殑鐖剁被綾昏杞藉櫒錛屼篃灝辨槸Extion ClassLoader錛岃闂畠鏄惁鑳藉瑁呰澆璇ョ被錛屽鏋滆兘錛岄偅AppClassLoader灝變笉騫茶繖媧諱簡錛屽悓鏍?/span>Extion ClassLoader鍦ㄨ杞芥椂錛屼篃浼氬厛闂棶瀹冪殑鐖剁被瑁呰澆鍣ㄣ傛垜浠彲浠ョ湅鍑虹被瑁呰澆鍣ㄥ疄闄呬笂鏄竴涓爲鐘剁殑緇撴瀯鍥撅紝姣忎釜綾昏杞藉櫒鏈夎嚜宸辯殑鐖朵翰錛岀被瑁呰澆鍣ㄥ湪瑁呰澆綾繪椂錛屾繪槸鍏堣鑷繁鐨勭埗綾昏杞藉櫒瑁呰澆(澶氫箞灝婃暚闀胯緢),濡傛灉鐖剁被瑁呰澆鍣ㄦ棤娉曡杞借綾繪椂錛岃嚜宸卞氨浼氬姩鎵嬭杞斤紝濡傛灉瀹冧篃瑁呰澆涓嶄簡錛岄偅涔堝涓嶈搗錛屽畠浼氬ぇ鍠婁竴澹幫細Exception錛?/span>class not found銆傛湁蹇呰鎻愪竴鍙ワ紝褰撶敱鐩存帴浣跨敤綾昏礬寰勮杞藉櫒瑁呰澆綾誨け璐ユ姏鍑虹殑鏄?/span>NoClassDefFoundException寮傚父銆傚鏋滀嬌鐢ㄨ嚜瀹氫箟鐨勭被瑁呰澆鍣?/span>loadClass鏂規硶鎴栬?/span>ClassLoader鐨?/span>findSystemClass鏂規硶瑁呰澆綾伙紝濡傛灉浣犱笉鍘誨埢鎰忔敼鍙橈紝閭d箞鎶涘嚭鐨勬槸ClassNotFoundException銆?/span>
鎴戜滑綆鐭葷粨涓涓嬩笂闈㈢殑璁ㄨ錛?/span>
1.JVM綾昏杞藉櫒鐨勪綋緋葷粨鏋勫彲浠ョ湅浣滄槸鏍戠姸緇撴瀯銆?/span>
2.鐖剁被瑁呰澆鍣ㄤ紭鍏堣杞姐傚湪鐖剁被瑁呰澆鍣ㄨ杞藉け璐ョ殑鎯呭喌涓嬪啀瑁呰澆錛屽鏋滈兘瑁呰澆澶辮觸鍒欐姏鍑?/span>ClassNotFoundException鎴栬?/span>NoClassDefFoundError寮傚父銆?/span>
閭d箞鎴戜滑鐨勭被鍦ㄤ粈涔堟儏鍐典笅琚杞界殑鍛紵
2. 綾誨浣曡瑁呰澆
鍦?/span>java2涓紝JVM鏄浣曡杞界被鐨勫憿錛屽彲浠ュ垎涓轟袱縐嶇被鍨嬶紝涓縐嶆槸闅愬紡鐨勭被瑁呰澆錛屼竴縐嶆槸鏄懼紡鐨勭被瑁呰澆銆?/span>
2.1 闅愬紡鐨勭被瑁呰澆
闅愬紡鐨勭被瑁呰澆鏄紪鐮佷腑鏈甯哥敤寰楁柟寮忥細
A b = new A();
濡傛灉紼嬪簭榪愯鍒拌繖孌典唬鐮佹椂榪樻病鏈?/span>A綾伙紝閭d箞JVM浼氳姹傝杞藉綋鍓嶇被鐨勭被瑁呭櫒鏉ヨ杞界被銆傞棶棰樻潵浜嗭紝鎴戞妸浠g爜寮勫緱澶嶆潅涓鐐圭偣錛屼絾渚濇棫娌℃湁浠諱綍闅懼害錛岃鎬濊?/span>JVM寰楄杞芥搴忥細
package test;
Public class A{
public void static main(String args[]){
B b 錛?/span> new B();
}
}
class B{C c;}
class C{}
鎻檽絳旀錛岀被瑁呰澆鐨勬搴忎負A->B錛岃岀被C鏍規湰涓嶄細琚?/span>JVM鐞嗕細,鍏堜笉瑕佹儕璁訛紝浠旂粏鎯蟲兂錛岃繖涓嶆鏄垜浠渶闇瑕佸緱鍒扮殑緇撴灉銆傛垜浠粩緇嗕簡瑙d竴涓?/span>JVM瑁呰澆欏哄簭銆傚綋浣跨敤Java A鍛戒護榪愯A綾繪椂錛?/span>JVM浼氶鍏堣姹傜被璺緞綾昏杞藉櫒(AppClassLoader)瑁呰澆A綾伙紝浣嗘槸榪欐椂鍙杞?/span>A錛屼笉浼氳杞?/span>A涓嚭鐜扮殑鍏朵粬綾?/span>(B綾?/span>)錛屾帴鐫瀹冧細璋冪敤A涓殑main鍑芥暟錛岀洿鍒拌繍琛岃鍙?/span>b 錛?/span> new B()鏃訛紝JVM鍙戠幇蹇呴』瑁呰澆B綾葷▼搴忔墠鑳界戶緇繍琛岋紝浜庢槸綾昏礬寰勭被瑁呰澆鍣ㄤ細鍘昏杞?/span>B綾伙紝铏界劧鎴戜滑鍙互鐪嬪埌B涓湁鏈?/span>C綾葷殑澹版槑錛屼絾鏄茍涓嶆槸瀹為檯鐨勬墽琛岃鍙ワ紝鎵浠ュ茍涓嶅幓瑁呰澆C綾伙紝涔熷氨鏄JVM鎸夌収榪愯鏃剁殑鏈夋晥鎵ц璇彞錛屾潵鍐沖畾鏄惁闇瑕佽杞芥柊綾伙紝浠庤岃杞藉敖鍙兘灝戠殑綾伙紝榪欎竴鐐瑰拰緙栬瘧綾繪槸涓嶇浉鍚岀殑銆?/span>
2.2 鏄懼紡鐨勭被瑁呰澆
浣跨敤鏄劇ず鐨勭被瑁呰澆鏂規硶寰堝錛屾垜浠兘瑁呰澆綾?/span>test.A涓轟緥銆?/span>
浣跨敤Class綾葷殑forName鏂規硶銆傚畠鍙互鎸囧畾瑁呰澆鍣紝涔熷彲浠ヤ嬌鐢ㄨ杞藉綋鍓嶇被鐨勮杞藉櫒銆備緥濡傦細
Class.forName("test.A");
瀹冪殑鏁堟灉鍜?/span>
Class.forName("test.A",true,this.getClass().getClassLoader());
鏄竴鏍風殑銆?/span>
浣跨敤綾昏礬寰勭被瑁呰澆瑁呰澆.
ClassLoader.getSystemClassLoader().loadClass("test.A");
浣跨敤褰撳墠榪涚▼涓婁笅鏂囩殑浣跨敤鐨勭被瑁呰澆鍣ㄨ繘琛岃杞斤紝榪欑瑁呰澆綾葷殑鏂規硶甯稿父琚湁鐫澶嶆潅綾昏杞戒綋緋葷粨鏋勭殑緋葷粺鎵浣跨敤銆?/span>
Thread.currentThread().getContextClassLoader().loadClass("test.A")
浣跨敤鑷畾涔夌殑綾昏杞藉櫒瑁呰澆綾?/span>
public class MyClassLoader extends URLClassLoader{
public MyClassLoader() {
super(new URL[0]);
}
}
MyClassLoader myClassLoader = new MyClassLoader();
myClassLoader.loadClass("test.A");
MyClassLoader緇ф壙浜?/span>URLClassLoader綾伙紝榪欐槸JDK鏍稿績鍖呬腑鐨勭被瑁呰澆鍣紝鍦ㄦ病鏈夋寚瀹氱埗綾昏杞藉櫒鐨勬儏鍐典笅錛岀被璺緞綾昏杞藉櫒灝辨槸瀹冪殑鐖剁被瑁呰澆鍣紝MyClassLoader騫舵病鏈夊鍔犵被鐨勬煡鎵捐寖鍥達紝鍥犳瀹冨拰綾昏礬寰勮杞藉櫒鏈夌浉鍚岀殑鏁堟灉銆?/span>
鎴戜滑宸茬粡鐭ラ亾Java鐨勭被瑁呰澆鍣ㄤ綋緋葷粨鏋勪負鏍戠姸錛屽涓被瑁呰澆鍣ㄥ彲浠ユ寚瀹氬悓涓涓被瑁呰澆鍣ㄤ綔涓鴻嚜宸辯殑鐖剁被錛屾瘡涓瓙綾昏杞藉櫒灝辨槸鏍戠姸緇撴瀯鐨勪竴涓垎鏀紝褰撶劧瀹冧滑鍙堝彲浠ヤ釜鏈夊瓙綾昏杞藉櫒綾昏杞藉櫒錛岀被瑁呰澆鍣ㄤ篃鍙互娌℃湁鐖剁被瑁呰澆鍣紝榪欐椂Bootstrap綾昏杞藉櫒灝嗕綔涓哄畠鐨勯殣鍚埗綾伙紝瀹為檯涓?/span>Bootstrap綾昏杞藉櫒鏄墍鏈夌被瑁呰澆鍣ㄧ殑紲栧厛錛屼篃鏄爲鐘剁粨鏋勭殑鏍廣傝繖縐嶆爲鐘朵綋緋葷粨鏋勶紝浠ュ強鐖剁被瑁呰澆鍣ㄤ紭鍏堢殑鏈哄埗錛屼負鎴戜滑緙栧啓鑷畾涔夌殑綾昏杞藉櫒鎻愪緵浜嗕究鍒╋紝鍚屾椂鍙互璁╃▼搴忔寜鐓ф垜浠笇鏈涚殑鏂瑰紡榪涜綾葷殑瑁呰澆銆備緥濡傛煇涓▼搴忕殑綾昏杞藉櫒浣撶郴緇撴瀯鍥懼涓嬶細
鍥?/span>2錛氭煇涓▼搴忕殑綾昏杞藉櫒鐨勭粨鏋?/span>
瑙i噴涓涓嬩笂闈㈢殑鍥撅紝ClassLoaderA涓鴻嚜瀹氫箟鐨勭被瑁呰澆鍣紝瀹冪殑鐖剁被瑁呰澆鍣ㄤ負綾昏礬寰勮杞藉櫒錛屽畠鏈変袱涓瓙綾昏杞藉櫒ClassLoaderAA鍜?/span>ClassLaderAB錛?/span>ClassLoaderB涓虹▼搴忎嬌鐢ㄧ殑鍙﹀涓涓被瑁呰澆鍣紝瀹冩病鏈夌埗綾昏杞藉櫒錛屼絾鏈変竴涓瓙綾昏杞藉櫒ClassLoaderBB銆備綘鍙兘浼氳錛岃楝鹼紝鎴戠殑紼嬪簭鎬庝箞浼氫嬌鐢ㄨ繖涔堝鏉傜殑綾昏杞藉櫒緇撴瀯銆備負浜嗚繘琛屼笅闈㈢殑璁ㄨ錛屾殏涓斿灞堜竴涓嬨?/span>
3. 濂囨殑闅旂鎬?/span>
鎴戜滑涓嶉毦鍙戠幇錛屽浘2涓殑綾昏杞藉櫒AA鍜?/span>AB錛?/span> AB鍜?/span>BB錛?/span>AA鍜?/span>B絳夌瓑浣嶄簬涓嶅悓鍒嗘敮涓嬶紝浠栦滑涔嬮棿娌℃湁鐖跺瓙鍏崇郴錛屾垜涓嶇煡閬撳浣曞畾涔夎繖縐嶅叧緋伙紝濮戜笖縐頒粬浠綅浜庝笉鍚屽垎鏀笅銆備袱涓綅浜庝笉鍚屽垎鏀殑綾昏杞藉櫒鍏鋒湁闅旂鎬э紝榪欑闅旂鎬т嬌寰楀湪鍒嗗埆浣跨敤瀹冧滑瑁呰澆鍚屼竴涓被錛屼篃浼氬湪鍐呭瓨涓嚭鐜頒袱涓?/span>Class綾葷殑瀹炰緥銆傚洜涓鴻鍏鋒湁闅旂鎬х殑綾昏杞藉櫒瑁呰澆鐨勭被涓嶄細鍏變韓鍐呭瓨絀洪棿錛屼嬌寰椾嬌鐢ㄤ竴涓被瑁呰澆鍣ㄤ笉鍙兘瀹屾垚鐨勪換鍔″彉寰楀彲浠ヨ交鑰屾槗涓撅紝渚嬪綾葷殑闈欐佸彉閲忓彲鑳藉悓鏃舵嫢鏈夊涓鹼紙铏界劧濂藉儚浣滅敤涓嶅ぇ錛夛紝鍥犱負灝辯畻鏄瑁呰澆綾葷殑鍚屼竴闈欐佸彉閲忥紝瀹冧滑涔熷皢琚繚瀛樹笉鍚岀殑鍐呭瓨絀洪棿錛屽張渚嬪紼嬪簭闇瑕佷嬌鐢ㄦ煇浜涘寘錛屼絾鍙堜笉甯屾湜琚▼搴忓彟澶栦竴浜涘寘鎵浣跨敤錛屽緢綆鍗曪紝緙栧啓鑷畾涔夌殑綾昏杞藉櫒銆傜被瑁呰澆鍣ㄧ殑榪欑闅旂鎬у湪璁稿澶у瀷鐨勮蔣浠跺簲鐢ㄥ拰鏈嶅姟紼嬪簭寰楀埌浜嗗緢濂界殑搴旂敤銆備笅闈㈡槸鍚屼竴涓被闈欐佸彉閲忎負涓嶅悓鍊肩殑渚嬪瓙銆?/span>
package test;
public class A {
public static void main( String[] args ) {
try {
//瀹氫箟涓や釜綾昏杞藉櫒
MyClassLoader aa= new MyClassLoader();
MyClassLoader bb = new MyClassLoader();
//鐢ㄧ被瑁呰澆鍣?/span>aa瑁呰澆testb.B綾?/span>
Class clazz=aa.loadClass("testb. B");
Constructor constructor=
clazz.getConstructor(new Class[]{Integer.class});
Object object =
constructor.newInstance(new Object[]{new Integer(1)});
Method method =
clazz.getDeclaredMethod("printB",new Class[0]);
//鐢ㄧ被瑁呰澆鍣?/span>bb瑁呰澆testb.B綾?/span>
Class clazz2=bb.loadClass("testb. B");
Constructor constructor2 =
clazz2.getConstructor(new Class[]{Integer.class});
Object object2 =
constructor2.newInstance(new Object[]{new Integer(2)});
Method method2 =
clazz2.getDeclaredMethod("printB",new Class[0]);
//鏄劇ずtest.B涓殑闈欐佸彉閲忕殑鍊?/span>
method.invoke( object,new Object[0]);
method2.invoke( object2,new Object[0]);
} catch ( Exception e ) {
e.printStackTrace();
}
}
}
//Class B 蹇呴』浣嶄簬MyClassLoader鐨勬煡鎵捐寖鍥村唴錛?/span>
//鑰屼笉搴旇鍦?/span>MyClassLoader鐨勭埗綾昏杞藉櫒鐨勬煡鎵捐寖鍥村唴銆?/span>
package testb;
public class B {
static int b ;
public B(Integer testb) {
b = testb.intValue();
}
public void printB() {
System.out.print("my static field b is ", b);
}
}
public class MyClassLoader extends URLClassLoader{
private static File file = new File("c:""classes ");
//璇ヨ礬寰勫瓨鏀劇潃class B錛屼絾鏄病鏈?/span>class A
public MyClassLoader() {
super(getUrl());
}
public static URL[] getUrl() {
try {
return new URL[]{file.toURL()};
} catch ( MalformedURLException e ) {
return new URL[0];
}
}
}
紼嬪簭鐨勮繍琛岀粨鏋滀負錛?/span>
my static field b is 1
my static field b is 2
紼嬪簭鐨勭粨鏋滈潪甯告湁鎰忔濓紝浠庣紪紼嬭呯殑瑙掑害錛屾垜浠敋鑷沖彲浠ユ妸涓嶅湪鍚屼竴涓垎鏀殑綾昏杞藉櫒鐪嬩綔涓嶅悓鐨?/span>java铏氭嫙鏈猴紝鍥犱負瀹冧滑褰兼瑙夊療涓嶅埌瀵規柟鐨勫瓨鍦ㄣ傜▼搴忓湪浣跨敤鍏鋒湁鍒嗘敮鐨勭被瑁呰澆鐨勪綋緋葷粨鏋勬椂瑕侀潪甯稿皬蹇冿紝寮勬竻妤氭瘡涓被瑁呰澆鍣ㄧ殑綾繪煡鎵捐寖鍥達紝灝介噺閬垮厤鐖剁被瑁呰澆鍣ㄥ拰瀛愮被瑁呰澆鍣ㄧ殑綾繪煡鎵捐寖鍥翠腑鏈夌浉鍚岀被鍚嶇殑綾伙紙鍖呮嫭鍖呭悕鍜岀被鍚嶏級錛屼笅闈㈣繖涓緥瀛愬氨鏄敤鏉ヨ鏄庤繖縐嶆儏鍐靛彲鑳藉甫鏉ョ殑闂銆?/span>
鍋囪鏈夌浉鍚屽悕瀛楀嵈涓嶅悓鐗堟湰鐨勬帴鍙?/span> A錛?/span>
鐗堟湰 1錛?/span>
package test;
Intefer Same{ public String getVersion(); }
鐗堟湰 2錛?/span>
Package test;
Intefer Same{ public String getName(); }
鎺ュ彛A涓や釜鐗堟湰鐨勫疄鐜幫細
鐗堟湰1鐨勫疄鐜?/span>
package test;
public class Same1Impl implements Same {
public String getVersion(){ return "A version 1";}
}
鐗堟湰2鐨勫疄鐜?/span>
public class Same 2Impl implements Same {
public String getName(){ return "A version 2";}
}
鎴戜滑渚濈劧浣跨敤鍥?/span>2鐨勭被瑁呰澆鍣ㄧ粨鏋勶紝棣栧厛灝嗙増鏈?/span>1鐨?/span>Same鍜?/span>Same鐨勫疄鐜扮被Same1Impl鎵撴垚鍖?/span>same1.jar錛屽皢鐗堟湰2鐨?/span>Same鍜?/span>Same鐨勫疄鐜扮被Same1Impl鎵撴垚鍖?/span>same2.jar銆傜幇鍦紝鍋氳繖鏍風殑浜嬫儏錛屾妸same1.jar鏀懼叆綾昏杞藉櫒ClassLoaderA鐨勭被鏌ユ壘鑼冨洿涓紝鎶?/span>same2.jar鏀懼叆綾昏鍣?/span>ClassLoaderAB鐨勭被鏌ユ壘鑼冨洿涓傚綋浣犲叴鍐插啿鐨勮繍琛屼笅闈㈣繖涓湅浼兼紜殑紼嬪簭銆?/span>
瀹為檯涓婅繖涓敊璇殑鏄敱鐖剁被杞藉櫒浼樺厛瑁呰澆鐨勬満鍒墮犳垚錛屽綋綾昏杞藉櫒ClassLoaderAB鍦ㄨ杞?/span>Same2Impl綾繪椂鍙戠幇蹇呴』瑁呰澆鎺ュ彛test.Same錛屼簬鏄寜瑙勫畾璇鋒眰鐖剁被瑁呰澆鍣ㄨ杞斤紝鐖剁被瑁呰澆鍣ㄥ彂鐜頒簡鐗堟湰1鐨?/span>test.Same鎺ュ彛騫跺叴鍐插啿鐨勮杞斤紝浣嗘槸鍗存兂涓嶅埌Same2Impl鎵甯屾湜鐨勬槸鐗堟湰2 鐨?/span>test.Same錛屽悗闈㈢殑浜嬫儏鍙兂鑰岀煡浜嗭紝寮傚父琚姏鍑恒?/span>
鎴戜滑寰堥毦璐f?/span>Java涓殏鏃跺茍娌℃湁鎻愪緵鍖哄垎鐗堟湰鐨勬満鍒訛紝濡傛灉浣跨敤浜嗘瘮杈冨鏉傜殑綾昏杞藉櫒浣撶郴緇撴瀯錛屽湪鍑虹幇浜嗘煇涓寘鎴栬呯被鐨勫涓増鏈椂錛屽簲鐗瑰埆娉ㄦ剰銆?/span>
鎺屾彙鍜岀伒媧昏繍鐢?/span>Java鐨勭被瑁呰澆鍣ㄧ殑浣撶郴緇撴瀯錛屽紼嬪簭鐨勭郴緇熻璁★紝紼嬪簭鐨勫疄鐜幫紝宸茬粡紼嬪簭鐨勮皟璇曪紝閮芥湁鐩稿綋澶х殑甯姪銆傚笇鏈涗互涓婄殑鍐呭鑳藉瀵規偍鏈夋墍甯姪銆?/span>