Java编程思想学习笔记——类型信息

1. Class.forName(className)用来加载指定类名,并返回Class对象,一般可忽略返回值。如果已有一个对象,可以通过getClass方法来获得Class对象。或者用ClassName.class也可以获得。

2. 通过Class对象,可以用getInterfaces方法getSuperClass方法获得其实现的接口及父类名,而且Class对象的newInstance方法可以创建该类的一个对象(必须要有无参构造函数)。

3. Class.forName方法加载时会进行静态代码的初始化(如jdbcDriver就必须用这种形式),而类名+.class的方式并不会立刻执行静态代码的初始化,而等第一次用该类时,才会进行。

4. Class<Number> cc=Integer.class;//错误,因为虽然Number是Integer的父类,但其Class对象并无父子关系。正确形式应该是:

Class <? extends Number> cc=Integer.class;

5. Class对象的isAssignableFrom()是用来判断一个类型是否是另一个类型的父类或接口,用法是:baseType.isAssignableFrom(sonType);

6. 反射。Class类与java.lang.reflect包一起对反射的概念进行支持。其中包含Field,Method,Constructor等对象也用Class对象的getFields等方法得到,并可用invoke方法调用类的方法。类方法观察器,RMI,及Java动态代理等都需要反射的支持。

7. 空对象模式。定义一个接口实现,NullInterface implements Interface{...}即空对象类。在定义一个对象时,可以使之默认初始化为空对象类,这样就可以省去许多的if(obj==null)语句了。

8. Tomcat Server在启动的时候将构造一个ClassLoader树,以保证模块的类库是私有的 

Tomcat Server的ClassLoader结构如下: 

  1.     Bootstrap  
  2.        |            
  3.      System   
  4.        |  
  5.      Common  
  6.     /      /  
  7. Catalina  Shared  
  8.           /    /  
  9.        WebApp1  WebApp2  


其中: 
- Bootstrap - 载入JVM自带的类和$JAVA_HOME/jre/lib/ext/*.jar 下JVM需要用到的类
- System - 载入$CLASSPATH/*.class Tomcat5之后不从CLASSPATH加载,而从tomcat-home/bin及tomcat-home/lib目录加载。
- Common - 载入$CATALINA_HOME/common/...,它们对TOMCAT和所有的WEB APP都可见 
- Catalina - 载入$CATALINA_HOME/server/...,它们仅对TOMCAT可见,对所有的WEB APP都不可见 
- Shared - 载入$CATALINA_HOME/shared/...,它们仅对所有WEB APP可见,对TOMCAT不可见(也不必见) 
- WebApp - 载入ContextBase?/WEB-INF/...,它们仅对该WEB APP可见 

同时,classes目录比同级的lib目录有优先权,如有同名者,用前者。

每个运行中的线程都有一个成员contextClassLoader,用来在运行时动态地载入其它类,系统默认的contextClassLoader是systemClassLoader,所以一般而言java程序在执行时可以使用JVM自带的类、$JAVA_HOME/jre/lib/ext/中的类和$CLASSPATH/中的类,可以使用Thread.currentThread().setContextClassLoader(...);更改当前线程的contextClassLoader,来改变其载入类的行为 

ClassLoader被组织成树形,一般的工作原理是: 
1) 线程需要用到某个类,于是contextClassLoader被请求来载入该类 
2) contextClassLoader请求它的父ClassLoader来完成该载入请求 
3) 如果父ClassLoader无法载入类,则contextClassLoader试图自己来载入 
注意:WebApp?ClassLoader的工作原理和上述有少许不同: 
它先试图自己载入类(在ContextBase?/WEB-INF/...中载入类),如果无法载入,再请求父ClassLoader完成 

由此可得: 
- 对于WEB APP线程,它的contextClassLoader是WebApp?ClassLoader 
- 对于Tomcat Server线程,它的contextClassLoader是CatalinaClassLoader

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值