总结一下:
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. 论文解读()《Cluster Alignment with a Teacher for Unsupervised Domain Adaptation》

    Note:[ wechat:Y466551 | 付费咨询,非诚勿扰 ] 论文信息 论文标题:Cluster Alignment with a Teacher for Unsupervised Doma ...

  2. 牛客小白月赛64 C题 题解

    题目链接 题意描述 这一题的意思其实就是,让你构造一个\(n * k\)的矩阵,使得第 i 列的总和为 i ,同时使得:每一列的任意两个数之间的差不大于1,且任意两行之间的总和差不大于1. \(1 \ ...

  3. Cilium系列-14-Cilium NetworkPolicy 简介

    系列文章 Cilium 系列文章 前言 今天我们进入 Cilium 安全相关主题, 介绍 Kubernetes 网络策略以及 CiliumNetworkPolicies 额外支持的内容. 网络策略(N ...

  4. 2023-08-06:小青蛙住在一条河边, 它想到河对岸的学校去学习 小青蛙打算经过河里 的石头跳到对岸 河里的石头排成了一条直线, 小青蛙每次跳跃必须落在一块石头或者岸上 给定一个长度为n的数组ar

    2023-08-06:小青蛙住在一条河边, 它想到河对岸的学校去学习 小青蛙打算经过河里 的石头跳到对岸 河里的石头排成了一条直线, 小青蛙每次跳跃必须落在一块石头或者岸上 给定一个长度为n的数组ar ...

  5. FreeSWITCH添加自定义endpoint之媒体交互

    操作系统 :CentOS 7.6_x64 FreeSWITCH版本 :1.10.9   之前写过FreeSWITCH添加自定义endpoint的文章: https://www.cnblogs.com/ ...

  6. [nginx]lua控制响应头

    前言 适用场景:添加CDN缓存时间.操作set-cookie.标记业务数据类型等. 获取响应头 指令:ngx.resp.get_headers 语法:headers = ngx.resp.get_he ...

  7. SpringBoot3集成ElasticSearch

    目录 一.简介 二.环境搭建 1.下载安装包 2.服务启动 三.工程搭建 1.工程结构 2.依赖管理 3.配置文件 四.基础用法 1.实体类 2.初始化索引 3.仓储接口 4.查询语法 五.参考源码 ...

  8. 【路由器】OpenWrt 简介和安装

    目录 简介 来源 介绍 安装 一般安装流程 固件搜索下载 参考资料 简介 来源 2002 年底 Linksys 公司推出 WRT-54G,采用了 Linux 取代了原来的 vXworks 系统.迫于 ...

  9. 《SQL与数据库基础》14. 存储过程 · 存储函数

    目录 存储过程 基本语法 变量 系统变量 用户定义变量 局部变量 if判断 参数 case判断 while循环 repeat循环 loop循环 游标 条件处理程序 存储函数 本文以 MySQL 为例 ...

  10. 入门篇-其之二-Java基础知识

    目录 对第一个Java程序的思考 外层结构--类 内层结构--main方法 输出语句 注释 单行注释 多行注释 文档注释 文档注释常用标签 使用javadoc命令生成网页风格的文档 阿里巴巴Java开 ...