天天看点

java类加载(java类加载过程详解)

Java虚拟机类加载过程是什么样的?
  虚拟机整个的加载过程可以分为7个阶段:加载-》验证-》准备-》解析-》初始化-》使用-》卸载。 
1。加载,这个过程虚拟机并没有明确规定何时进行,但是规定了只有以下四种情况必须立即进行加载。 
1)遇到new,getstatic,putstatic,invokestatic四条指令的时候,对应的场景:使用new关键字,读取或设置一个类的静态字段(final静态字段除外),以及调用类的静态方法的时候。
什么是java类加载机制?
  getParent方法返回的是上级类加载器 
ExtClassLoader,但是,从类文件的观念看,他们不是继承关系,只能看做引用关系 
在加载的时候,如果在我这一层,首先会去找父亲,看看他加载了没,父亲再找父亲的父亲加载了没, 
没有才一步步下来,最后由我自己加载,这里讲父亲,不是父类!,有点子债父还的意思 
好处是安全,因为classLoader也是个类,所以如果不用这个机制,想解析一个很简单的类,写病毒的人可以自己写个classLoader用来解析这些本来系统自带的ClassLoader就可以解析的类在里面加点病毒代码,这样解析一些简单的类的时候,它会去找加载器,找到了我自己写的病毒Classloader,如果加载的话就出事了,java这个体系,它即使找到了病毒Classloader,也不会立刻使用,它会往上找如果他的长辈(系统自带的能解析这个类的ClassLoader)能加载,就由系统解决了,就用不上这个病毒ClassLoader类了,所以说,比较安全!。
java 类加载先后顺序
根据static的特性,在类被加载的时候执行!
所以我们可以使用static来进行测试!
测试代码如下:
public class Test{
public static void main(String[] args){
//
}
static{
System.out.println("class Test");
}
class A{
static{
System.out.println("class A");
class B{
 static{
System.out.println("class B");
执行结果:
class Test
结论:实际上,在java中,只有你已经用到的类,JVM才会执行加载,而且加载顺序是:主类-->其他类(与在主类中被使用的顺序相同)
验证代码如下:
public class Test{
public static void main(String[] args){
//
new A();
new B();
}
static{
System.out.println("class Test");
}
class A{
static{
System.out.println("class A");
class B{
 static{
System.out.println("class B");
执行结果:
class Test
class A
class B1.父类静态代码块;
2.子类静态代码块;
3.父类非静态代码块;
4.父类构造函数;
5.子类非静态代码块;
6.子类构造函数;
public class ExA { 
static { 
System.out.println("父类静态代码块。"); 
} 
public ExA() { 
System.out.println("父类构造函数。"); 
} 
{ 
System.out.println("父类非静态代码块。"); 
} 
public static void main(String[] args) { 
new ExB(); 
} 
class ExB extends ExA { 
static { 
System.out.println("子类静态代码块。"); 
} 
{ 
System.out.println("子类非静态代码块。"); 
} 
public ExB() { 
System.out.println("子类构造函数。"); 
} 
执行结果:父类静态代码块。子类静态代码块。父类非静态代码块。父类构造函数。子类非静态代码块。子类构造函数。父类到子类
静态到非静态类的加载不是在编译的时候,编译只是将Java的源文件编译成字节码文件(*.class),而,但Java程序在执行的时候才开始加载所需要的类,Java程序的入口时主方法,所以先加载的肯定是Test类,由于没有使用到A和B类,所以执行的时候就没有加载他们。
本人也是初学者,回答有错误的话请别见怪!
Java中类加载出现在哪个阶段,编译期和运行期? 类加载和类装载是一样的吗
使用的类,编译/运行时都会被加载。
加载/装载没有区别,翻译的词汇选择因人而异了
运行 javac /java 时 加上 -verbose 选项就可以看到了。你好!
我认为java类在编译的时候就被加载,两个理由:
例1:import另外一个包下的类,如果到运行的时候才加载,那能import成功吗?
例2:方法的重载,又叫编译时多态性,类都没有加载,哪来的方法重载?
仅代表个人观点,不喜勿喷,谢谢。运行期。不一样。Java中类加载出现在运行期间。类加载=类装载 就是ClassLoader