总结一下:
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. DolphinScheduler3.1.7集成SAP HANA

    源码地址:GitHub - apache/dolphinscheduler at 3.1.7-release 个人fork gitee地址:DolphinScheduler:Gitee) 后端代码更改 ...

  2. ABP VNext添加全局认证(如何继承AuthorizeFilter)

    前言 目前公司采用的开发框架是ABP VNext微服务框架 最近突然发现一个问题,ABP中如果控制器或服务层没有加 Authorize特性的话,则不会走身份认证,且不会认证Token 如图: 但是项目 ...

  3. WPF自定义控件之消息提示

    创建消息提示控件 internal class Message : ContentControl { public int Time { get; set; } [Bindable(true)] pu ...

  4. 代码随想录算法训练营第八天| LeetCode 344.反转字符串 541. 反转字符串II 151.翻转字符串里的单词

    344.反转字符串 卡哥建议: 本题是字符串基础题目,就是考察 reverse 函数的实现,同时也明确一下 平时刷题什么时候用 库函数,什么时候 不用库函数 题目链接/文章讲解/视频讲解:https: ...

  5. 记一次MySql灾难性事件

    2023年8月8日,本来系一个风和日丽的夏天中的平凡一天,但这种平凡,注定住佢一定唔平凡,唉...现在回忆起都阵阵咁痛!!! 重要嘅事情讲三次,唔好手贱,唔好手贱,唔好手贱 事日,如常上班,本人系一名 ...

  6. 使用 OpenTelemetry 构建 .NET 应用可观测性(1):什么是可观测性

    目录 什么是系统的可观测性(Observability) 为什么需要软件系统需要可观测性 可观测性的三大支柱 日志(Logging) 指标(Metrics) 分布式追踪(Distributed Tra ...

  7. 《CTFshow-Web入门》03. Web 21~30

    @ 目录 web21 题解 原理 web22 题解 原理 web23 题解 原理 web24 题解 原理 web25 题解 原理 web26 题解 web27 题解 web28 题解 web29 题解 ...

  8. React Native实现Toast轻提示和loading

    React Native 封装Toast 前言 使用react native的小伙伴都知道,官方并未提供轻提示组件,只提供了ToastAndroid API,顾名思义,只能再安卓环境下使用,对于ios ...

  9. pandas常用的数据类型,(serises和dataform)

  10. WebAssembly实践指南——C++和Rust通过wasmtime实现相互调用实例

    C++和Rust通过wasmtime实现相互调用实例 1 wasmtime介绍 wasmtime是一个可以运行WebAssembly代码的运行时环境. WebAssembly是一种可移植的二进制指令集 ...