总结一下:
1、类加载(初始化)
包括加载(类的class文件读入内存,并为之创建一个java.lang.Class对象,由类加载器完成)、连接(把类的二进制数据合并到JRE中)、初始化(对静态属性进行初始化) 三个步骤

2、什么时候会 进行 类加载(初始化)

    (1)创建类的实例:包括用new、反射、反序列化来创建 (反序列化时候——构造器不会被调用,类似于赋值也不会被调用)
    (2)调用某个类的静态方法
    (3)访问某个类或接口的静态属性,或为该静态属性赋值  (final类型的静态属性,如果它的值在编译时就可以得到,系统使用时会认为是对该类的被动使用,所以不会导致该类的初始化)
    (4)使用反射来强制创建某个类或接口对应的java.lang.Class对象。例如,代码Class.forName("Person") (或者:Person.class),如果系统还未初始化Person类,则这行代码会导致该Person类被初始化,并返回Person类对应的java.lang.Class对象
    (5)初始化某个类的子类
    (6)直接使用java.exe来运行某个主类,当运行某个主类时,程序会先初始化该主类
    (7)直接使用类加载器来加载类——当使用ClassLoader类的loadClass()方法加载某个类时,该方法只是加载该类,并不会执行该类的初始化

3、获取 某个类或接口对应的java.lang.Class对象 的方法
(1)上述的第(4)点里——Person.class
(2)上述的第(4)点里——Class.forName("Person")
(3)Person person = new Person(); person .getClass();
(4)上述第(7)点,    //运行main方法的时候,ReflectTest主类已经被加载,这时候可以用ReflectTest的类加载器来加载其他类
        Class<?> clazzD = ReflectTest.class.getClassLoader().loadClass("wxtest.D"); 

例:
  1 package wxtest;
2
3 import java.lang.reflect.InvocationTargetException;
4 import java.lang.reflect.Method;
5
6 import sun.security.jca.GetInstance.Instance;
7
8
9 public class ReflectTest {
10 public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {
11 Class<?> clazzA = A.class;
12 System.out.println(clazzA);
13
14 Class<?> clazzB = Class.forName("wxtest.B"); //会初始化静态化块
15 System.out.println(clazzB);
16
17 C c = new C(); //会初始化静态化块
18 System.out.println("new C()结束");
19 Class<?> clazzC = c.getClass();
20
21
22 //运行main方法的时候,ReflectTest已经被加载,这时候可以用ReflectTest的类加载器来加载其他类
23 Class<?> clazzD = ReflectTest.class.getClassLoader().loadClass("wxtest.D");
24 System.out.println(clazzD);
25
26
27 Class<?> clazz1 = LcdTV.class;
28 System.out.println(clazz1);
29
30 Class<?> clazz2 = Class.forName("wxtest.LcdTV");
31 System.out.println(clazz2);
32
33 LcdTV lcdTV = new LcdTV();
34 Class<?> clazz3 = lcdTV.getClass();
35 System.out.println(clazz3);
36
37 System.out.println("clazz1 equals clazz2 ? = " + clazz1.equals(clazz2));
38 System.out.println("clazz1 equals clazz3 ? = " + clazz1.equals(clazz3));
39
40 Object instace = clazz3.newInstance(); //调用默认构造器
41 System.out.println("实例化好的对象为= " + instace);
42
43 //调用 public void turnOn()
44 Method method = clazz3.getMethod("turnOn", new Class<?>[]{});
45 method.invoke(instace, new Object[]{}); //参数2是什么:调用方法的实参列表 */
46
47 }
48 }
49
50 class A {
51 static {
52 System.out.println("A中的静态块初始化...");
53 }
54 }
55
56 class B {
57 static {
58 System.out.println("B中的静态块初始化...");
59 }
60 }
61
62 class C {
63 static {
64 System.out.println("C中的静态块初始化...");
65 }
66 }
67
68 class D {
69 static {
70 System.out.println("D中的静态块初始化...");
71 }
72 }
73
74 interface Televition {
75 void turnOn();
76 void turnOff();
77 }
78
79 //液晶电视
80 class LcdTV implements Televition {
81
82 private boolean on = false;
83 public final int size; //public final int size=0;会报错
84 static {
85 System.out.println("LcdTV静态代码块被初始化...");
86 }
87
88 public LcdTV() {
89 size = 32; //The blank final field size may not have been initialized
90 }
91
92 public LcdTV(int size) {
93 this.size = size;
94 }
95
96 @Override
97 public void turnOn() {
98 System.out.println(size + "寸 电视被打开");
99 on = true;
100 }
101
102 @Override
103 public void turnOff() {
104 System.out.println(size + "寸 电视被关闭");
105 on = false;
106 }
107 }

结果为:

C中的静态块初始化...
new C()结束
class wxtest.D
class wxtest.LcdTV
LcdTV静态代码块被初始化...
class wxtest.LcdTV
class wxtest.LcdTV
clazz1 equals clazz2 ? = true
clazz1 equals clazz3 ? = true
实例化好的对象为= wxtest.LcdTV@70f9f9d8
32寸 电视被打开
 参考:
http://www.ibm.com/developerworks/cn/java/j-lo-classloader/
http://blog.csdn.net/xyang81/article/details/7292380

JAVA类的加载(5)——总结的更多相关文章

  1. jvm系列(一):java类的加载机制

    java类的加载机制 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装 ...

  2. Java类的加载、链接和初始化

    一.Java的类加载机制回顾与总结: 我们知道一个Java类要想运行,必须由jvm将其装载到内存中才能运行,装载的目的就是把Java字节代码转换成JVM中的java.lang.Class类的对象.这样 ...

  3. java 类的加载,链接,初始化

    本篇的话题,讨论Java类的加载.链接和初始化.Java字节代码的表现形式是字节数组(byte[]),而Java类在JVM中的表现形式是java.lang.Class类的对象.一个Java类从字节代码 ...

  4. 【Java基础】Java类的加载和对象创建流程的详细分析

    相信我们在面试Java的时候总会有一些公司要做笔试题目的,而Java类的加载和对象创建流程的知识点也是常见的题目之一.接下来通过实例详细的分析一下. 实例问题 实例代码 Parent类 package ...

  5. Java类的加载和对象创建流程的详细分析

    相信我们在面试Java的时候总会有一些公司要做笔试题目的,而Java类的加载和对象创建流程的知识点也是常见的题目之一.接下来通过实例详细的分析一下: package com.test; public ...

  6. Java类的加载的一个小问题

    前言 之前写了一篇文章专门介绍了一下类的加载和对象的创建流程,然后收到了一个博友的疑问,觉得蛮好的,在这里和大家分享下. 博文地址:[Java基础]Java类的加载和对象创建流程的分析 疑问 类在加载 ...

  7. JAVA类的加载、连接与初始化

    JAVA类的加载.连接与初始化 类的声明周期总共分为5个步骤1.加载2.连接3.初始化4.使用5.卸载 当java程序需要某个类的时候,java虚拟机会确保这个类已经被加载.连接和初始化,而连接这个类 ...

  8. Java类的加载 链接 初始化

    原文地址 Java类的加载.链接和初始化.Java字节代码的表现形式是字节数组(byte[]),而Java类在JVM中的表现形式是java.lang.Class类的对象.一个Java类从字节代码到能够 ...

  9. 别翻了,这篇文章绝对让你深刻理解java类的加载以及ClassLoader源码分析【JVM篇二】

    目录 1.什么是类的加载(类初始化) 2.类的生命周期 3.接口的加载过程 4.解开开篇的面试题 5.理解首次主动使用 6.类加载器 7.关于命名空间 8.JVM类加载机制 9.双亲委派模型 10.C ...

  10. java类从加载、连接到初始化过程

    类加载器 在了解Java的机制之前,需要先了解类在JVM(Java虚拟机)中是如何加载的,这对后面理解java其它机制将有重要作用. 每个类编译后产生一个Class对象,存储在.class文件中,JV ...

随机推荐

  1. 如何使用CCXT交易数字货币现货

    更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流. 数字货币现货标准化接口 数字货币市场与股票.期货市场最大的不同点在于数字货币主流交易所数量很多.举个例子 ...

  2. Redis的五大数据类型及其使用场景

    前言 redis是一个非常快速‎‎的非关系数据库‎‎解决方案.其简单的键值数据模型使 Redis 能够处理大型数据集,同时保持令人印象深刻的读写速度和可用性.‎redis提供了五种数据类型,分别是是: ...

  3. Axios向后段请求数据GET POST两种方法的不同之处

    GET请求 向后端请求时,通过URL向后端传递参数 axios({ url:'http://127.0.0.1:9000/get-user-list/', type:'json', //GET方法携带 ...

  4. go run 和 go build的区别

    go run:编译并运行程序,但不会产生exe文件,运行速度也相应较慢 go build : 会产生exe文件,运行速度快

  5. 使用 RediSearch 在 Redis 中进行全文检索

    原文链接: 使用 RediSearch 在 Redis 中进行全文检索 Redis 大家肯定都不陌生了,作为一种快速.高性能的键值存储数据库,广泛应用于缓存.队列.会话存储等方面. 然而,Redis ...

  6. Vu3+Element-Plus根据路由配置生成菜单导航栏

    先看效果,整体界面结构如下 点击左侧菜单栏,右侧切换显示不同页面内容. Vue3使用路由–南河小站 1 路由配置 路由配置如下: const routes = [ { path: "&quo ...

  7. 从0开始,Cloudreve开源云盘在centos7上部署,并可在外网访问(资料整合)

    全程我在网络上收集这些资料,太零碎了,每一个一看就会,一动手就废,而且很多都不能实现我白嫖的梦想 我一个人折腾了快一周,现在可以正常访问手机电脑多端访问 给个赞再走吧 此处为没有公网IP(回去折腾你家 ...

  8. P8810 [蓝桥杯 2022 国 C] 数组个数 题解

    思路比较简单的一道题. 用的五维 dp,看到二维和三维的 dp 直接膜了 orz. 正文开始. 分析 不难看出 dp. 因为 \(b_i\) 的值只与 \(a_{i-1},a_i,a_{i+1}\) ...

  9. 论文解读(WIND)《WIND: Weighting Instances Differentially for Model-Agnostic Domain Adaptation》

    Note:[ wechat:Y466551 | 可加勿骚扰,付费咨询 ] 论文信息 论文标题:WIND: Weighting Instances Differentially for Model-Ag ...

  10. python flask 简单应用开发

    转载请注明出处: Flask 是一个基于 Python 的微型 Web 框架,它提供了一组简洁而强大的工具和库,用于构建 Web 应用程序.Flask 的主要作用是帮助开发者快速搭建轻量级的.灵活的 ...