注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

断尘居

温柔的男人像海洋。

 
 
 
 
 

日志

 
 

Java之Classloader体系结构  

2011-10-31 01:10:26|  分类: JVM/ HotSpot |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

jvm classLoader architecture :

a, Bootstrap ClassLoader/启动类加载器
主要负责jdk_home/lib目录下的核心 api 或 -Xbootclasspath 选项指定的jar包装入工作.

 

b, Extension ClassLoader/扩展类加载器
主要负责jdk_home/lib/ext目录下的jar包或 -Djava.ext.dirs 指定目录下的jar包装入工作

 

c, System ClassLoader/系统类加载器
主要负责java -classpath/-Djava.class.path所指的目录下的类与jar包装入工作.

 

b, User Custom ClassLoader/用户自定义类加载器(java.lang.ClassLoader的子类)
在程序运行期间, 通过java.lang.ClassLoader的子类动态加载class文件, 体现java动态实时类装入特性.

 

类加载器的特性:

1, 每个ClassLoader都维护了一份自己的名称空间, 同一个名称空间里不能出现两个同名的类。
2, 为了实现java安全沙箱模型顶层的类加载器安全机制, java默认采用了 ” 双亲委派的加载链 ” 结构.


如下图:
java class loader

Class Diagram:
classloader 类图

类图中, BootstrapClassLoader是一个单独的java类, 其实在这里, 不应该叫他是一个java类。
因为, 它已经完全不用java实现了。

 

它是在jvm启动时, 就被构造起来的, 负责java平台核心库。(具体上面已经有介绍)

启动类加载实现 (其实我们不用关心这块, 但是有兴趣的, 可以研究一下 ):
bootstrap classLoader 类加载原理探索

 

自定义类加载器加载一个类的步骤 :

自定义类加载器加载一个类的步骤

 

ClassLoader 类加载逻辑分析, 以下逻辑是除 BootstrapClassLoader 外的类加载器加载流程:

// 检查类是否已被装载过
Class c = findLoadedClass(name);
if (c == null ) {
     // 指定类未被装载过
     try {
         if (parent != null ) {
             // 如果父类加载器不为空, 则委派给父类加载
             c = parent.loadClass(name, false );
         } else {
             // 如果父类加载器为空, 则委派给启动类加载加载
             c = findBootstrapClass0(name);
         }
     } catch (ClassNotFoundException e) {
         // 启动类加载器或父类加载器抛出异常后, 当前类加载器将其
         // 捕获, 并通过findClass方法, 由自身加载
         c = findClass(name);
     }
}

用Class.forName加载类
Class.forName使用的是被调用者的类加载器来加载类的.
这种特性, 证明了java类加载器中的名称空间是唯一的, 不会相互干扰.

即在一般情况下, 保证同一个类中所关联的其他类都是由当前类的类加载器所加载的.

public static Class forName(String className)
     throws ClassNotFoundException {
     return forName0(className, true , ClassLoader.getCallerClassLoader());
}
 
/** Called after security checks have been made. */
private static native Class forName0(String name, boolean initialize,
ClassLoader loader)
     throws ClassNotFoundException;

上图中 ClassLoader.getCallerClassLoader 就是得到调用当前forName方法的类的类加载器

线程上下文类加载器
java默认的线程上下文类加载器是 系统类加载器(AppClassLoader).

// Now create the class loader to use to launch the application
try {
    loader = AppClassLoader.getAppClassLoader(extcl);
} catch (IOException e) {
    throw new InternalError(
"Could not create application class loader" );
}
 
// Also set the context class loader for the primordial thread.
Thread.currentThread().setContextClassLoader(loader);


以上代码摘自sun.misc.Launch的无参构造函数Launch()。

使用线程上下文类加载器, 可以在执行线程中, 抛弃双亲委派加载链模式, 使用线程上下文里的类加载器加载类.
典型的例子有, 通过线程上下文来加载第三方库jndi实现, 而不依赖于双亲委派.

大部分java app服务器(jboss, tomcat..)也是采用contextClassLoader来处理web服务。
还有一些采用 hotswap 特性的框架, 也使用了线程上下文类加载器, 比如 seasar (full stack framework in japenese).

线程上下文从根本解决了一般应用不能违背双亲委派模式的问题.

使java类加载体系显得更灵活.

 

随着多核时代的来临, 相信多线程开发将会越来越多地进入程序员的实际编码过程中. 因此,
在编写基础设施时, 通过使用线程上下文来加载类, 应该是一个很好的选择.

 

当然, 好东西都有利弊. 使用线程上下文加载类, 也要注意, 保证多根需要通信的线程间的类加载器应该是同一个,
防止因为不同的类加载器, 导致类型转换异常(ClassCastException).

 

自定义的类加载器实现
defineClass(String name, byte[] b, int off, int len,ProtectionDomain protectionDomain)
是java.lang.Classloader提供给开发人员, 用来自定义加载class的接口.

使用该接口, 可以动态的加载class文件.

 

例如,
在jdk中, URLClassLoader是配合findClass方法来使用defineClass, 可以从网络或硬盘上加载class.

而使用类加载接口, 并加上自己的实现逻辑, 还可以定制出更多的高级特性.

 

比如,

一个简单的hot swap 类加载器实现:

import java.io.File;
import java.io.FileInputStream;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
 
/**
* 可以重新载入同名类的类加载器实现
*
 
* 放弃了双亲委派的加载链模式.
* 需要外部维护重载后的类的成员变量状态.
*
* @author ken.wu
* @mail ken.wug@gmail.com
* 2007-9-28 下午01:37:43
*/
public class HotSwapClassLoader extends URLClassLoader {
 
    public HotSwapClassLoader(URL[] urls) {
        super (urls);
    }
 
    public HotSwapClassLoader(URL[] urls, ClassLoader parent) {
        super (urls, parent);
    }
 
    public Class load(String name)
          throws ClassNotFoundException {
        return load(name, false );
    }
 
    public Class load(String name, boolean resolve)
          throws ClassNotFoundException {
        if ( null != super .findLoadedClass(name))
            return reload(name, resolve);
 
        Class clazz = super .findClass(name);
 
        if (resolve)
            super .resolveClass(clazz);
 
        return clazz;
    }
 
    public Class reload(String name, boolean resolve)
          throws ClassNotFoundException {
        return new HotSwapClassLoader( super .getURLs(), super .getParent()).load(
            name, resolve);
    }
}
 
public class A {
    private B b;
 
    public void setB(B b) {
         this .b = b;
    }
 
    public B getB() {
         return b;
    }
}
 
public class B {}


这个类的作用是可以重新载入同名的类, 但是, 为了实现hotswap, 老的对象状态
需要通过其他方式拷贝到重载过的类生成的全新实例中来。(A类中的b实例)

而新实例所依赖的B类如果与老对象不是同一个类加载器加载的, 将会抛出类型转换异常(ClassCastException).

为了解决这种问题, HotSwapClassLoader自定义了load方法. 即当前类是由自身classLoader加载的, 而内部依赖的类

 

还是老对象的classLoader加载的.

public class TestHotSwap {
public static void main(String args[]) {
    A a = new A();
    B b = new B();
    a.setB(b);
 
    System.out.printf("A classLoader is %s n" , a.getClass().getClassLoader());
    System.out.printf("B classLoader is %s n" , b.getClass().getClassLoader());
    System.out.printf("A.b classLoader is %s n" ,   a.getB().getClass().getClassLoader());
 
    HotSwapClassLoader c1 = new HotSwapClassLoader( new URL[]{ new URL( "file:\e:\test\")} , a.getClass().getClassLoader());
    Class clazz = c1.load(" test.hotswap.A ");
    Object aInstance = clazz.newInstance();
 
    Method method1 = clazz.getMethod(" setB ", B.class);
    method1.invoke(aInstance, b);
 
    Method method2 = clazz.getMethod(" getB ", null);
    Object bInstance = method2.invoke(aInstance, null);
 
    System.out.printf(" reloaded A.b classLoader is %s n", bInstance.getClass().getClassLoader());
}
}

输出

A classLoader is sun.misc.Launcher$AppClassLoader@19821f
B classLoader is sun.misc.Launcher$AppClassLoader@19821f
A.b classLoader is sun.misc.Launcher$AppClassLoader@19821f
reloaded A.b classLoader is sun.misc.Launcher$AppClassLoader@19821f

  评论这张
 
阅读(1193)| 评论(0)
Sag"Re茨n>d"iv> ade&nbsod=" &nbsod=" ri"> od="pood="pood="t-align:left;f-myLikeIddes repan bt自 C这縲pag;&nri"> od="pood="f">er$AppClassLoadam>er$AppClassLoad>er$AppClassLo>er$AppClassLo>
snlrm" method="title="发布到LOFTER" target="_blan ac, tdwb tds2hao f c namn> der$AppClassLof"> n> yodasp; tdwb tds2hao f
;_zoom:1 nce, b>er$AppClassLof"> n> $_dExOldBan LinkBot覦iv ' 40 ptcmt">转发' 9">&nb>er$AppC9">&naohe162.blogisc - "textrm" method="f">h4iv> tdwb tds2hao f fs0">历史蒪r>今天">转发至>er$AppCod="pood>er$AppC9">&naohe1bsp;
;visibilame: actio;width:0;paniCom0;overflow: actio; ">*
rm" 9">&nbs>h4iv> tdwb tds2hao f fs0">最近读者&nbs>
c n/javaiv>">转发至>er$AppC9">&naer$AppC9">&naohe1bsp;
;visibilame: actio;width:0;paniCom0;overflow: actio; n> hodivea "hodivea >*
&rm" 9">&nbs>h4iv> tdwb tds2hao f fs0">热度&nbs> hodli ">转发至>er$AppC9">&naer$AppC9">&naohe1> ac,amn> yodasp;_="nbsp;er$AppC9">&n" 9">&naohe162.blogm-lmact>">; bsp;
rm" 9">&nbsf">/upload="adounk" 实现 "#
ac,focusp:/nbs;l>g"> sp;究襫> ght:mact>">; t t 9">&nbsf"> n> fgt;hadwss=er$AppC9">&nbsf">i理web , rginwidth="0 rginpaniCo="0 n> gmac_i理web bsp;
究襴idth="590 paniCo="og."韜ebbateer="0 nd"oloung="no"abilowassni">;&ncyp:/nbs;l>/i理webm" 9">&n>er$AppC9">&n" 9">&naohem" 9">&n >h4iv> tdwb tds2hao f fs0" bsp;0 在03 noueClfintj_2&n bsp;&n >i理web bsp; eate茨ntepx_理web恳width="og.% paniCo="o2关衎ilowassni">;&ncyp:/nbs; nd"oloung="no"a理webbateer="0 nrc db ?e.<=>
ei理webm" 9">&nuncher$Ap9">&naer$AppC9">&naohe1n> gspan>fix"ounk>; bsp;
;paddung:0 6nt 0 5ntCrm" 9">&nbstitle="发布祊aniCommentCount">0)&:#ffffe1Cfix"> " 9">&nbsf"><br>&"float:}&ghn;paniCom2entCount">0 9">&nbsf">nce, b);
nce, b>/ubsp;de茨s :ns">究沂迪 "颐遣挥霉匦膒an> 链模;/div> ;下要抢ZX43 >er$AppC9">&nf">er$AppC9">&naer$AppC9">&na
cspan>)rm" 9">&nbsth4iv> tdwb tds2hao f fs0">_spa&nf">/u"http:- /span>)" n> - /span>)"t 9">&nbsaohe162.blogzow >er$AppC9">&n>er$AppC9">&na
"textr n> yodasp;_putbsp;er$AppCod="po>er$AppCod="po>
c这/javai 3 >er$AppCod=">er$AppCod=>er$AppCod>er$AppC>er$AppC>
"text/nb-ter rm" =">fix"ivea="http:jdiv Perm nk:'', ader体系结构" /> nri之Cla\>ap cp\p从竆>ent" value="<p><strong>jvsLo\>der architecture</strong> :</p> <p>a, Bootstrap ClassLoader/启 cp\p从竆>nce, b>ep\p从竆>心 api 或 -Xbootclasspath 选项指定的jsLo\>der architecture<gt;&nbsp;</p> <p>b, Extension ClassLoader/扩 cp\p从竆>nce, b>ep\p从竆>膉ar包或 -Djava.ext.dirs 指定目录蟬Lo\>der archi;/p> <p>&nbsp;</p> <p>c, System ClassLo cp\p从竆>nce, b>ep\p从竆> cp\p', )* .', _sung&nb'>/u ac,focusp:/nbs;/div> 实现 "颐遣挥胓etin.- .163链模/- ri.

g"> ondExc="v0-4ng">

pubImagelas4ng">.src \'颐遣挥- .163链模/dEx> asLoyse.lasspan> _sung&n&t \'+dEx D assLoaTime()" bateer="0 nrc g">lf.nosdncla7s="ptg">/TlZCWHdFWFpidkQ1dGtJK1N5cFRBNzBLUFFPYnJEVi9LWk1KTzJlMTU2Yz0.jpg" t ' /fix"iveam" =">fix"ivea="http:jdnamn> m-3-jst-http://zh{li /p>as x}" =" {lt;!!x}" =" aohe162.blognbc-fr>&nbc-f40"> /upload=" 3Loaulamdiv> ac,focusp:/nbs;/实现 "颐遣挥- .163链模/${x.visitor联的}/;l com/"${x.visitor羒ck"htt|esc>还}" s">der.p://ws.src c .f40"/> cwd tdwahao futbrc ${fn1(x.visitor联的)}&r=${visitor. Upd Time}" t g"> com/"${x.visitor羒ck"htt|esc>还}" s">der.p://ws.src c .f40"/> cwd tdwahao futbrc ${fn1(x.visitor联的)}" t /upload="oaul远 迪 - .163链模/va;vices/nbs- .html?0870nbssosLo- home;l><b, java" b, 网易手机博客"/> nbsIdde nce, b>ei"> od="po {elselt;x.moveF870=='i<">'}" =" ="od=">/upload="oaul远 l><b, java" b, iPlt">客户端"/> i<">Idde nce, b>ei"> od="po {elselt;x.moveF870=='andrbsp'}" =" ="od=">/upload="oaul远 l><b, java" b, Andrbsp客户端"/> andrbspIdde nce, b>ei"> od="po {elselt;x.moveF870=='mobil>'}" =" ="od=">/upload="oaul远 实现 "颐遣挥- .163链模/va;vices/ <b, java" b, 网易短信写博"/> nbsIdde nce, b>ei"> od="po {ei纝" =" ="f">/u> 3Lm2a mdiv> ac,focusp:/nbs;/实现 "颐遣挥- .163链模/${x.visitor联的}/;l 还} er$AppCod="{ei纝" =" {/li }" ="fix"ivea="http:jdnamn> m-3-jst-http://zh{lt;!!a}" =" >/udiv> 迪 - .163链模/${a.ava;&nbs}/;l>g"> > tdwahao f远der.p://ws.src c .f60"/brc ${fn1(a.ava;&nbs)}" t>e /udiv> > 3Lm2a 实现 "颐遣挥- .163链模/${a.ava;&nbs}/;l${fn(a.nick"htt,8)|esc>还}>e

&nbro 5;l${) {还}{lt;gveat260}${retlean>)}{ei纝>er$AppC9">&na
s/javasc>er$AppC9">aohe162.blogmbga="text/x"i /upload=" 3Lx"i m2a 实现 "#
t>e e还}>e fix"ivea="http:jdnamn> m-3-jst-orm" meth

推"过这篇日志强伤: cp as x}" =" {lt;!!x}" =" ="> nbc-fr>&nbc-f40"> /u> 3Loaulamdiv> ac,focusp:/nbs;/实现 "颐遣挥- .163链模/${x.te茨n>da;&nbs}/;l g"> com/"${x.te茨n>da;&ick"htt|esc>还}" s">der.p://ws.src c .f40"/> cwd tdwahao futbrc ${fn1(x.te茨n>da;&钠}" t cwd tB(c,a /u> 3Lm2a div> ac,focusp:/nbs; 实现 "颐遣挥- .163链模/${x.te茨n>da;&膤/;l 还} e eohe p /> 6">他们还推"了: cp as y}" =" ="{lt;!!y}" =" ="=">li/> rrb;l><b> /upload=" 3Lm2a div> 迪 - .163链模/${y.te茨n>dB Perm nk}/?0870=- ri.

dB Tit&n|esc>还}>e as x}" =" =">li/> v>">转发至 还}>e ohe n-r ;l><>>/udiv> > 7 m2a 实现 "${x.teferHomePage};l${x.teferjava联的|esc>还}>e ohe eul <#--博主推"-- <>fix"ivea="http:jdnamn> m-3-jst-6"> as x}" =" {lt;!!x}" =" ali/> tB(c,a >/udiv> > 3Lm2a 实现 "颐遣挥- .163链模/${x.ava;&nbs}/${x.nbsm nk}/?te茨n>dB ;, java"${x., jav|c,fault:""|esc>还};l${x., jav|c,fault:""|esc>还}>e fix"ivea="http:jdnamn> m-3-jst- as x}" =" {lt;!!x}" =" ali/> tB(c,a >/udiv> > 3Lm2a 实现 "颐遣挥- .163链模/${x.ava;&nbs}/${x.nbsm nk}/?nbssosLoRe茨 ;, java"${x., jav|c,fault:""|esc>还};l${x., jav|c,fault:""|esc>还}>e fix"ivea="http:jdnamn> m-3-jst-8 as x}" =" {lt;!!x}" =" ali/> tB(c,a >/udiv> > 3Lm2a div> 迪 ${x.- Url|c,fault:""|esc>还}?te茨n>dighte , jav/"${x.- Til>|c,fault:""|esc>还};l${x.- Til>|c,fault:""|esc>还}>e as x}" =" {lt;x_髋譭x>4}{bveak}{ei纝 li/> tB(c,40 pt=" 实现 "颐遣挥- .163链模/${x.ava;&nbs}/${x.nbsm nk|c,fault:""}" , jav/"${x., jav|c,fault:""|esc>还};l${fn1(x., jav,60)|esc>还}>e > ${fn2(x.p>shTime,'yyyy-MM-dd HH:mm:ss');&ni"> eul <#--被推"日志-- <>fix"ivea="http:jdnamn> m-3-jst-=http://zh{li /p>as x}" =" {lt;!!x}" =" ali/> tB(c,a >/udiv> > 3Lm2a 实现 "${f&nb()}${x.nbsm nk}/;l${fn(x., jav,26)|esc>还}>e #--上一篇,下一篇-- <>fix"ivea="http:jdnamn> m-3-jst-1http://zh {lt;!!(- Det<sp;eB Perm nk)}" =" =" ei"> tB(c,a >/u> m2a 实现 "颐遣挥>
还}>e ei">
}&ghn tB(c,a >/u> m2a 实现 "颐遣挥>
还}>e /upload=" 3Loaulamdiv> ac,focusp:/nbs;/实现 "颐遣挥- .163链模/${x.p>sherjava"htt}/;l com/"${x.p>sherNick"htt|esc>还}" s">der.p://ws.src c .f40"/> cwd tdwahao futbrc ${fn1(x.p>sherjava"htt)}&r=${visitor. Upd Time}" t g"> com/"${x.p>sherNick"htt|esc>还}" s">der.p://ws.src c .f40"/> cwd tdwahao futbrc ${fn1(x.p>sherjava"htt)}" t /u> 3Lm2a div> ac,focusp:/nbs; 实现 "颐遣挥- .163链模/${x.p>sherjava"htt}/;l 还} /u> f-myLikeIddes hodtype {lt;x.,ype==1} js-like,ype{elselt;x.,ype==2} js-repan ,ype{elselt;x.,ype==3} js-e="disype{else}{ei纝amdiv> ac,focusp:/nbs; 实现 "颐遣挥- .163链模/${x.p>sherjava"htt}/;lnce, b>e eohe
ttl-0-40 p6 tdwb tdc0 tds0">网易新闻>eohe dExsc na /u> hghtdExs pac,focusp:/nbs; div> 迪 ${hght nes.&nb_3w|esc>还}a ag"> ${g">size(hght nes.g">src,240,150,/nbs苶" ai"> > icover;l>ni"> ai"> > info;l><b> 还} i"> ni"> ae aul {lt;/strond('dExsli ')&&dExsli .length>0}" =" {li /dExsli >as x}" =" =" {lt;x_髋譭x>7}{bveak}{ei纝 "">li/> tB(c,;l>/u ac,focusp:/nbs;/div> 实现 "${x.anb_3w|esc>还}au> 5;lt-align:left;dona · i"> ${x., jav|esc>还} eul > downdExc163dExs >/u> f 3 udiv> ac,focusp:/nbs; 实现 "颐遣挥 163链模/dExsapp/;l下载网易新闻客户端 ZX43 >eohe eohe <#--右边模块结构-- <>fix"ivea="http:txnamn> m-3-txn-0"> uinfo/javasc>er$AppC >h4iv> fs0 lt/s pac,/javasc被推"日志ul> zow bl nul h4iv> fs0 lt/s pac,/javasc最新日志ul> zow bl nul h4iv> fs0 lt/s pac,/javasc该作者的其他tj_2ul> zow bl nul h4iv> fs0 lt/s pac,/javasc博主推"ul> zow bl nul h4iv> fs0 lt/s pac,/javasc随机="edul> zow bl nul h4iv> fs0 lt/s pac,/javasc首页推"ul> zow bl nul eate;l>/udiv> > 3Lm2a 实现 "颐遣挥- 163链模">lfinZX43TX43 >er$AppC >br t>br t yodasp;_ bsp; 綺zoom:1 >er$AppCod="> pan> _sung&nn - P量状cAccbr> n yodasp;_2 bsp;er$AppCod="> v>">转发至>nn e-3-txn-http://zh > close;l ei"> n zow "textrl>n#--博主发起的投票-- <>fix"ivea="http:jst" n> e-3-txn-3 as x}" =" {lt;!!x}" =" "">lil /u 迪 - .163链模/${x.ava;&nbs}/ udiv> > m2a40 pt="${x.nick联的|esc>还}>e nce, bnce, b投票给 n
nnd"ip"l nnd"ip"l &(Rand *4Range)as )l);)ById("j-koala-ads")s nnd"ip"l >n
l&g hog." nce, b>e
r cr hog." nce, b>en nb-mb lcr bh i">ceal l bl bh" nce, b>e r br bh" nce, b>e c bc bh lcr" nce, b>ennn l詗l g lg hog." nce, b>e l詗l t lt" nce, b>e l詗l b lb;lnce, b>n -4wr g rg hog." nce, b>e -4wr t rt" nce, b>e -4wr b rb;lnce, b>nnn nb-ive&nb-smb;l> wkg h i">ceal> g h;lnce, b>n r h;lnce, b>n c h;lnce, b>nnn nb-ive&nb-fona <> wkg hal 页脚 k"> >;/p>"nogt;启"/> m2a40 p8 udiv> 迪 yxp 163链模";下的LOFT书>e ->nn"> 迪 - 163链模/p>c/thean/;l博客风格>e ->nn"> 迪 - 163链模/va;vices/nbs- .html">手机博客>e ->nn"> 迪 pan> 链模gapp? =qbboke_4"i504"9_0htt下载03 nou APP>e
->nn"> t-align:left;0 p8 un> $_foot_subnd"ibe;l>i"> > i- ck m2a ei"> >/u> m2a40 p8 >订阅此博客>e >nn"> np/> 8 网易公司版权所有nce, bncopy;o997-4"i7 cp <>nnn!--[lt;lbe IE 6]l>n*if]-- <>!--[lt;lbe IE 6]l>n*if]-- <>
nb-laye n> - -163-茨-laye l>n nb-tpl&nb-ter "textr n> - -163-茨- "> >fix"ivea=rowsp:="nel=sp:="n"htt="jst" n> nb-jst-ahtt >;/p>"nogt;启"/> p , rgem/"_bt;/k" 实现 "颐遣挥胔elp 163链模nn"ecial/007525FT/- .html?b13azehtt帮助>e <>i"> > fr i">ce nn"> <>/u> p , rgem/"_bt;/k" 实现 "颐遣挥- 163链模/ iv .do?hsha= iv &&uava"htt=${u};l${u;&n fix"ivea=rowsp:="nel=sp:="n"htt="jst" n> nb-jst-d0"> {li /wl as x}" =" > grp;l${x.g;&n/u> itmLoaulam 迪 #fix"ivea=rowsp:="nel=sp:="n"htt="jst" n> nb-jst-dhtt {lt;/strond('wl'); /u> itmLoaulam 迪 # /dws's < c .dws
/c>籺cha.jpgx?">;&ntId=3Cla6790&r='s < c .mrt ce/p;eview/'s < c .f60&ce140.las's < c .f40&

&n_add.gif's < c .phtoto_dveam_* /", pror>&n/", ppssnk/", ", pan>archivn/;] ;seIn('11111111',2);

*va:'他'