Java类加载过程

一、前言

我们都知道计算机的底层逻辑都是0和1的编码,当然除了现在所研究的量子计算除外。那么我们在计算机所做的一切操作,底层原理是不是都可以翻译到0和1呢。如果刨根问底的话,可以这么说,当然0和1的表示也属于逻辑门电路电的状态。大规模集成电路就是用来存储逻辑门电路的。那么一个Java的对象在计算机中是怎么存在的。我们通过一个java对象深入了解程序在计算机上的运行逻辑。

二、JAVA对象

JAVA作为高级编程语言,非常接近自然语言。比如声明一个对象 String s = new String();

s 为对象的引用,new String() 为声明对象。

比如我们编写如下代码:

java 复制代码
public class Test {
	public static void main(String[] args) {
		
		String s = new String();
		System.out.println(s.getClass());
		System.out.println(s.getBytes());
		System.out.println(s.length());
		System.out.println(s.hashCode());
		System.out.println(new String());
	 
	}

}

编译成class文件

java 复制代码
漱壕   4 3
 
   
  	  
 
 
  
  
  
  
   
  !  "  # <init> ()V Code LineNumberTable main ([Ljava/lang/String;)V 
SourceFile 	Test.java   java/lang/String  $ % & ' (  ) * + , - . / * 0 1 / * 2 Test java/lang/Object java/lang/System out Ljava/io/PrintStream; getClass ()Ljava/lang/Class; java/io/PrintStream  println (Ljava/lang/Object;)V getBytes ()[B length ()I (I)V hashCode (Ljava/lang/String;)V !  
                  *? ?            	       n     >? Y? L? +? ? ? +?  ? ? +? ? 	? +? 
? 	? ? Y? ? 
?                    &  0 	 = 
      

运行class文件输出

C:\Users\lenovo\Desktop\test>java Test

class java.lang.String

B@15db9742 0 0 ```java C:\Users\lenovo\Desktop\test>java Test class java.lang.String [B@15db9742 0 0 ``` 那么编译到class文件到执行class是一个怎样的过程。这里就要说到java虚拟机。 三、java虚拟机 ![](https://file.jishuzhan.net/article/1712752853975568386/c71aa10cdd7843f638c783ceffef269e.webp) 类的加载过程 1.1 加载 Java的类加载器会根据类的全限定名来加载类,当需要使用某个类时,如果该类还未被加载进内存,则需要执行一下步骤进行加载: 1.1.1. 通过类的全限定名找到对应的class文件,这里的class文件可以是.java文件经过编译之后生成的.class文件,也可以是通过其他方式生成的.class文件。 1.1.2 将class文件中的二进制数据读取到内存中,并将其转换为方法区的运行时数据结构。 1.1.3 创建由该类所属的java.lang.Class对象。该对象可以理解为,是对类的各种数据(如名称、访问修饰符、方法、成员变量等)的封装。 在加载类时,类加载器除了加载某个具体的类外,还需要将这个类所依赖的类也加入到内存中。这种依赖性是多层级的,也就是说,被依赖的类又可能会去依赖其他类,所以在加载一个类时,通常需要将其类图中所有的类都加载进来。

相关推荐
带刺的坐椅5 小时前
Solon AI 开发学习9 - chat - 聊天会话(对话)的记忆与持久化
java·ai·llm·openai·solon·mcp
曹牧5 小时前
Oracle中ROW_NUMBER() OVER()
java·数据库·sql
客梦5 小时前
数据结构-哈希表
java·数据结构·笔记
Yolo566Q5 小时前
基于ArcGIS、InVEST与RUSLE水土流失模拟及分析
开发语言·python
草原印象5 小时前
Spring SpringMVC Mybatis框架整合实战
java·spring·mybatis·spring mvc
八个程序员5 小时前
c++——探讨a÷b(long long)
开发语言·c++
四谎真好看6 小时前
Java 黑马程序员学习笔记(进阶篇30)
java·笔记·学习·学习笔记
Amarantine、沐风倩✨6 小时前
深度解析:轨迹数据抽稀到底该放数据库还是 Java?(以 56800 条数据为例)
java·开发语言·数据库
听风吟丶6 小时前
Java 分布式追踪实战:SkyWalking+Spring Cloud 构建微服务全链路监控体系
java
小马爱打代码6 小时前
Spring AI:使用 Advisor 组件 - 打印请求大模型出入参日志
java·人工智能·spring