Java 类的装载过程
查看Java load class 的信息:
java -verbose:class MyClass
测试代码
public class MyTest{
public static void main(String args[]) throws ClassNotFoundException,
InstantiationException, IllegalAccessException {
Class cla = Class
.forName("A", true, CRCCheckSum.class.getClassLoader());
System.out.println("After Class.forName(). Before class.newInstance()");
cla.newInstance();
new A();
Class.forName("A"); // find class A ,skip load
}
}
class A {
public A() {
System.out.println("public A() Constructor");
}
static {
System.out.println("static Code");
}
{ System.out.println("non static Code");
}
}
输出:
static Code
After Class.forName(). Before class.newInstance()
non static Code
public A() Constructor
non static Code
public A() Constructor
我的理解:
让Java加载类有三种情况,
1.直接new ,如:new MyClass();
2.Class.forName, 如:Class.forName
("org.gjt.mm.mysql
.Driver")
3.定义ClassLoader,用其loadClass方法.
JVM加载一个未加载过的类分几步:
a.装载 b.连接 c.初始化 d.实例化
对于1.直接就abcd连着执行了
对于2.其有两个方法可以选择是ab,还是abc.
对于3.如果改变实现似乎可以控制到a,和ab.
1就不分析了.
对于2
有两个方法:
1)Class.forName(String className)
2)Class.forName(forName
(String
name,
boolean initialize,
ClassLoader
loader)
后者的initialize参数是指名,是否需要在装载连接完毕类后,进行初始化的工作.也就是执行static代码等.
如果Class.forName("MyClass") 则相当于:Class.forName("MyClass",true,this.getClass.getClassLoder());
这个也就是为什么要用
Class.forName("com.mysql.jdbc.Driver"
);
来注册driver
因为com.mysql.jdbc.Driver中有这样的代码:
public class Driver extends NonRegisteringDriver
{
public Driver() throws SQLException
{ }
static
{
try {
DriverManager.registerDriver(new Driver());
}
catch(SQLException E) {
throw new RuntimeException("Can't register driver!");
}}}
这样调用,由于在Class.forName进行加载的时候会自动执行初始化,也就是想DriverManager注册自己.
所以就不必再用newInstance()来生成一个实例.
对于3.有这样两个方法
ClassLoader.loadClass(String className);
protected ClassLoader.loadClass(String className,boolean resolve);
关于resolve的行为还不太懂,改天继续写.
classLoder 层次:
bootstrap classloader
|
extension classloader
|
system classloader
获得bootstrap classLoader加载哪些内容:
URL[] urls=sun.misc.Launcher.getBootstrapClassPath().getURLs();
for (int i = 0; i < urls.length; i++) {
System.out.println(urls[i].toString());
}
获得SystemClassLoader(): ClassLoader.getSystemClassLoader()
获得ExtensionClassLoader():ClassLoader.getSystem.ClassLoader().getParent();
参考文章:
http://www.iteye.com/topic/25053
http://www.iteye.com/topic/189897
http://www.iteye.com/topic/11003
http://www.iteye.com/topic/12084
http://www.iteye.com/topic/68170
http://www.iteye.com/topic/70217
分享到:
相关推荐
学习HTML与CSS的相关笔记代码.zip学习HTML与CSS的相关笔记代码.zip 学习HTML与CSS的相关笔记代码.zip学习HTML与CSS的相关笔记代码.zip 学习HTML与CSS的相关笔记代码.zip学习HTML与CSS的相关笔记代码.zip 学习HTML与...
Swift学习笔记含项目代码.zipSwift学习笔记含项目代码.zipSwift学习笔记含项目代码.zipSwift学习笔记含项目代码.zipSwift学习笔记含项目代码.zipSwift学习笔记含项目代码.zipSwift学习笔记含项目代码.zipSwift学习...
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); //Sql Server7.0/2000 数据库 Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); //DB2 数据库 Class.froName(...
「MIT 6.005 Reading 1 Static Checking」课程讲义,带中文笔记。
HTML笔记. J2EE笔记. Javascript笔记. JAVA笔记.oracle 笔记.Linux笔记.tomcat笔记.面试问题.数据结构.听韩顺平的笔记.正则表达式.等,我是我在上大学时学习做的笔记,拿出来和大家共享。。
r for data science 笔记代码.R
C++学习笔记......................................
嵌入式Liunx应用程序开发笔记-代码.zip嵌入式Liunx应用程序开发笔记-代码.zip嵌入式Liunx应用程序开发笔记-代码.zip嵌入式Liunx应用程序开发笔记-代码.zip嵌入式Liunx应用程序开发笔记-代码.zip嵌入式Liunx应用程序...
1.2 static 类<?> forName(String name, boolean initialize, ClassLoader loader) name:全限定路径名 initialize:表示是否初始化,默认是false loader:可以指定一个类加载器加载...
电磁场与电磁波LaTeX笔记.zip电磁场与电磁波LaTeX笔记.zip电磁场与电磁波LaTeX笔记.zip电磁场与电磁波LaTeX笔记.zip电磁场与电磁波LaTeX笔记.zip电磁场与电磁波LaTeX笔记.zip电磁场与电磁波LaTeX笔记.zip电磁场与...
1: Class.forName(“全类名”); 2:类对象名.getClass(); 3:类名.Class(); 通过Class 对象获得类的指定成员,构造方法 构造方法: Constructor 成员方法: Method 成员变量:Field Class对象.getConstructor(参数...
Visual C++程序设计学习笔记的源代码,有需要的赶快下啊。
包含斯坦福大学课程笔记中文版 Coursera课程笔记以及作业答案matlab 完整版
课后习题答案以及代码
Python学习笔记-10.类(Class)1.pdf
h.264源代码分析笔记,详细的介绍了源代码的过程。把源代码的主要函数,与每个函数实现的功能。每个函数的变量代表的意思,进行了详细的介绍。能让初学者事半功倍,笔记倾情奉献!本人花费半年的时间的进行代码调试...
_X2 笔记 单例模式(单一实例模式) class db { private static $obj = NULL; private function __construct() { } private function __clone() { } public static function instance() { if(!is_object(self::$obj...
1 jdbc的任务 1用一个数据库建立连接 2向... 连接Oracle oracle.jdbc.driver.OracleDriver: 然后使用Class.forName("驱动")来进行注册 在使用该类时,需抛出ClassNotFoundException异常
韩顺平java笔记完整版 这是韩顺平老师java教学视频的全部笔记,所有代码都有的!(无笔记,只是代码)
狂神笔记