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)
blank

相关推荐

发表回复

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

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