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结构如下:
- Bootstrap
- |
- System
- |
- Common
- / /
- Catalina Shared
- / /
- 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