java类加载和初始化_java静态变量什么时候初始化

java类加载和初始化_java静态变量什么时候初始化????Java学习路线配套文章:Java学习路线总结,搬砖工逆袭Java架构师(全网最强)????基础推荐:Java基础教程系列????实战推荐:SpringBoot基础教程????简介:Java领域优质创作者????、CSDN哪吒公众号作者✌、Java架构师奋斗者????????扫描主页左侧二维码,加入群聊,一起学习、一起进步????欢迎点赞????收藏⭐留言????目录一、类的加载与ClassLoader的理解1、加载2、链接3、初始化二、什么时候会发生类初始化1

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

? Java学习路线配套文章:Java学习路线总结,搬砖工逆袭Java架构师(全网最强)
? 基础推荐:Java基础教程系列
? 实战推荐:Spring Boot基础教程
? 简介:Java领域优质创作者?、CSDN哪吒公众号作者✌ 、Java架构师奋斗者?
? 扫描主页左侧二维码,加入群聊,一起学习、一起进步
? 欢迎点赞 ? 收藏 ⭐留言 ?

一、类的加载与ClassLoader的理解

1、加载

将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后生成一个代表这个类的java.lang.class对象。

2、链接

将Java类的二进制代码合并到JVM的运行状态之中的过程。

  1. 验证:确保加载的类信息符合JVM规范,没有安全方面的问题;
  2. 准备:正式为类变量分配内存并设置类变量默认初始值的阶段,这些内存都将在方法区内进行分配;
  3. 解析:虚拟机常量池内的符号引用(常量名)替换为直接引用(地址)的过程。

3、初始化

  1. 执行类构造器()方法的过程。类构造器()方法是由编译期自动收集类中所有类变量的赋值动作和静态代码块中的语句合并产生的。(类构造器是构造类信息的,不是构造该类对象的构造器)。
  2. 当初始化一个类的时候,如果发现其父类还没有进行初始化,则需要先触发其父类的初始化。
  3. 虚拟机会保证一个类的()方法在多线程环境中被正确加锁和同步。

二、什么时候会发生类初始化

1、类的主动引用(一定会发生类的初始化)

  1. 当虚拟机启动,先初始化main方法所在的类;
  2. new一个类的对象; 调用类的静态成员(除了final常量)和静态方法;
  3. 使用java.lang.reflect包的方法对类进行反射调用;
  4. 当初始化一个类,如果其父类没有被初始化,则先会初始化它的父类;

2、类的被动调用(不会发生类的初始化)

  1. 当访问一个静态域时,只有真正声明这个域的类才会被初始化。如:当通过子类引用父类的静态变量,不会导致子类初始化;
  2. 通过数组定义类引用,不会触发此类的初始化;
  3. 引用常量不会触发此类的初始化(常量在链接阶段就存入调用类的常量池中了);

三、类加载器的作用

将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后在堆中生成一个代表这个类的java.lang.Class对象,作为方法区中类数据的访问入口。

四、动态创建对象执行方法

package com.reflection;
 
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
 
public class Test03 { 
   
    public static void main(String[] args) throws Exception { 
   
        //获得class对象
        Class c1 = Class.forName("com.reflection.User");
        //1、构造一个对象,本质是无参构造器
        User user1 = (User) c1.newInstance();
        System.out.println(user1);
 
        //2、通过构造器创建对象
        Constructor constructor = c1.getDeclaredConstructor(int.class, String.class, int.class);
        User user2 = (User) constructor.newInstance(1,"郭一诺",1);
        System.out.println(user2);
 
        //3、通过反射调用普通方法
        User user3 = (User) c1.newInstance();
        Method setName = c1.getDeclaredMethod("setName", String.class);
        //invoke激活
        setName.invoke(user3,"素小暖");
        System.out.println(user3.getName());
 
        //4、通过反射操作属性
        User user4 = (User) c1.newInstance();
        Field name = c1.getDeclaredField("name");
        //true:取消Java语言访问检查
        name.setAccessible(true);
        name.set(user4,"素小暖2");
        System.out.println(user4.getName());
    }
}

更多用法详见:【Java基础知识 15】java反射机制原理详解

上一篇:Java零基础入门 16:java反射详解

下一篇:Java零基础入门 18:java接口

在这里插入图片描述


添加微信,备注1024,赠送Java学习路线思维导图

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/169726.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 优化SQLServer——表和分区索引(二)

    优化SQLServer——表和分区索引(二)

    2021年11月25日
  • ResNet34学习笔记+用pytorch手写实现

    ResNet34学习笔记+用pytorch手写实现看懂ResNet,需要理解两个点:shortcut的处理,以及网络结构理解1——IdentityMappingbyShortcuts(快捷恒等映射)我们每隔几个堆叠层采用残差学习。构建块如图2所示。在本文中我们考虑构建块正式定义为x和y是考虑的层的输入和输出向量。函数F(x,Wi)表示要学习的残差映射。图2中的例子有两层,F=W2σ(W1x)中σ表示ReLU[29],为了…

  • Log4J 配置文件 指定类 properties

    Log4J 配置文件 指定类 properties

  • 编译原理 实验3 递归下降语法分析程序设计

    编译原理 实验3 递归下降语法分析程序设计实验目的】练习构造递归下降语法分析程序的方法,熟悉上下文无关文法的使用,加深对课堂教学的理解;提高语法分析方法的实践能力【实验要求】利用某一高级程序设计语言构造语法分析程序【具体要求】对于给定的文法G[E]E->TE’E’->+TE’|εT->F…

  • 阿里druid数据连接池jar包(完整版)[通俗易懂]

    阿里druid数据连接池jar包(完整版)[通俗易懂]Druid(德鲁伊)是阿里巴巴开发的号称为监控而生的数据库连接池,Druid是目前最好的数据库连接池。在功能、性能、扩展性方面,都超过其他数据库连接池,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况。Druid已经在阿里巴巴部署了超过600个应用,经过一年多生产环境大规模部署的严苛考验。Druid地址:https://github.com/alibaba/druidDRUID连…

  • 杂摘「建议收藏」

    杂摘「建议收藏」计算机的基本理论不能丢,于是重点看组成原理,数据机构,操作系统、c++。同时论坛上了解到,实时操作系统ucos是一个很好的嵌入式操作系统,对初学者很好。于是我就买了一本书,但是代码在电脑里调不通,网上也有很多相同的问题,我就看书,分析代码,一遍不行就两遍,三遍,这样才看了入了门,才知道什么是进程。原来看操作系统书时,根本就不知道进程是个什么东西。www.embeded.cn重复是最好的老师

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号