设为首页 收藏本站
查看: 346|回复: 0

[经验分享] tomcat源代码学习08-06-18

[复制链接]

尚未签到

发表于 2017-2-1 08:25:08 | 显示全部楼层 |阅读模式
在主类中有这么三个属性:

protected ClassLoader commonLoader = null;
protected ClassLoader catalinaLoader = null;
protected ClassLoader sharedLoader = null;

ClassLoader 是jdk中自带的api类,那么它是一个什么样的类呢?它其实是java中的类加载器,是负责加载类的对象。ClassLoader 类是一个抽象类。如果给定类的二进制名称,那么类加载器会试图查找或生成构成类定义的数据。一般策略是将名称转换为某个文件名,然后从文件系统读取该名称的“类文件”。

String className = "java.lang.Integer";
try {
Class []parameterTypes = {int.class};
Object [] initargs = {1};
Constructor constr = ClassLoader.getSystemClassLoader().loadClass(className).getConstructor(parameterTypes);
Integer i = (Integer)constr.newInstance(initargs);
System.out.println("执行完毕:"+i.longValue());

上面是我写的一段小程序来测试这个类,假如我要装载一个类,叫作:java.lang.Integer,并且该类名必须是一个二进制名称 ,按照《Java Language Specification》的定义,任何作为 String 类型参数传递给 ClassLoader 中方法的类名称都必须是一个二进制名称。
有效类名称的示例包括:

"java.lang.String"
"javax.swing.JSpinner$DefaultEditor"
"java.security.KeyStore$Builder$FileBuilder$1"
"java.net.URLClassLoader$3$1"


注意:ClassLoader是一个抽象类不能构造对象,ClassLoader.getSystemClassLoader()这个方法却可以让我们获得系统自带的类装载器,那么通过该装载器装载进来的就是jdk里的Integer类了。
  例如,应用程序可以创建一个网络类加载器,从服务器中下载类文件。示例代码如下所示:

ClassLoader loader = new NetworkClassLoader(host, port);
Object main = loader.loadClass("Main", true).newInstance();

          . . .
网络类加载器子类必须定义方法 findClass 和 loadClassData,以实现从网络加载类。下载组成该类的字节后,它应该使用方法 defineClass 来创建类实例。示例实现如下:

class NetworkClassLoader extends ClassLoader {
String host;
int port;
public Class findClass(String name) {
byte[] b = loadClassData(name);
return defineClass(name, b, 0, b.length);
}
private byte[] loadClassData(String name) {
// load the class data from the connection
. . .
}
}

  但是,如果我自己来定义个ClassLoader的具体子类,并且用该子类构造的对象来装载我自己的类,同样装载java.lang.Integer就可以获得一个不同的类了。改类的class字节流可能来自于文件系统,也可以来自己网络的某个环境,这就非常好了。
  回到tomcat源代码,它定义这么三个类来装载实际上就是用自己的方式来装载类。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-335944-1-1.html 上篇帖子: struts2.0.11.1和tomcat问题 下篇帖子: Tomcat中Context容器配置详解(二)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表