JVM类加载(1)—加载

1、加载:

查找并加载类,将.class文件中的二进制数据读入到内存中,放在运行时数据区的方法内,然后在堆内创建一个java.lang.class对象用来封装类在方法区内的数据结构。并且向程序员提供了访问方法区内的数据结构的接口,程序中类的实例通过getClass()方法获取类在堆中的class对象,通过class对象可以完成对方法区中类数据结构的访问。

class文件的加载方式:

(1)、本地系统加载

(2)、网络下载.class文件

(3)、jar包、zip文件中获取

(4)、从专有数据库中提取.class文件

(5)、将Java源文件动态编译为.class文件

类加载器的类型:

Java虚拟机自带的加载器

(1)、根类加载器(BootStrap),C++实现,Java程序员无法在代码中获取到该类

(2)、扩展类加载器(Extension),Java代码实现

(3)、系统类加载器(System),又叫应用加载器,Java代码实现

用户自定义的加载器

继承java.lang.ClassLoader,用户可以定制类的加载方式

Java规范允许类加载器在预料到某个类将要被使用时就预先加载它,如果在预先加载的过程中遇到class文件缺失或存在错误,类加载器会在首次主动使用该类时才报告错误(LinkageError错误), 如果这个类一直没有被程序使用,那么类加载器就不会报错。

类被加载进内存之后后就进入连接阶段。

时间: 2024-12-15 06:52:23

JVM类加载(1)—加载的相关文章

JVM自定义类加载器加载指定classPath下的所有class及jar

一.JVM中的类加载器类型 从Java虚拟机的角度讲,只有两种不同的类加载器:启动类加载器和其他类加载器. 1.启动类加载器(Boostrap ClassLoader):这个是由c++实现的,主要负责JAVA_HOME/lib目录下的核心 api 或 -Xbootclasspath 选项指定的jar包装入工作. 2.其他类加载器:由java实现,可以在方法区找到其Class对象.这里又细分为几个加载器 a).扩展类加载器(Extension ClassLoader):负责用于加载JAVA_HOM

虚拟机(JVM)如何加载类

首先JVM加载类的一般流程分三步: 加载 链接 初始化 那么是否全部Java类都是这样三步走的方式加载呢?我们可以从Java的数据类型去出发.Java分基本类型和引用类型.其中按照面向对象的特性,一切皆对象,那么对于基本类型也应该是对象.但是为了在执行效率和内存占用上进行调优,Java将基本类型特殊处理.所以Java基本类型加载都是Java虚拟机预先定义好了,所以没有加载这个步骤了.引用类型就是类,接口,数组.其中数组是直接由虚拟机直接生成的.类和接口是字节流,都是需要加载. 正文 Java基本

自定义类加载器——加载任意指定目录的class文件

public class MyClassLoader extends ClassLoader{ String path;//自定义类加载器所负责的文件夹 public MyClassLoader(String path) { super(); this.path = path; } @SuppressWarnings("deprecation") @Override protected Class<?> findClass(String name) throws Class

通过类加载器加载资源文件

/*******************************************第一种方法***************************************************************/ public class Demo {    //资源文件可以通过类加载器的方式加载到内存中,这种方式的好处是程序不用明确制定配置文件的具体所在目录.程序可以自动的在    //src目录下搜索该文件,并加载    //采用下面这种方法还有一种弊端,就是,通过类加载器加载

Android进阶:十三、自定义类加载器加载加密类文件

之前面试的时候有许多面试官问类加载器相关的问题,所以这是一个很重要的知识点.而且对于高级Android研发来讲,懂得更多类加载相关的东西,对开发也会有很多的帮助,比如热更新,类加密等.其实笔者对类加密比较感兴趣,就稍稍调研了一下.类加密的其实是为了防止APP被反编译,防止反编译的方法有很多种,比如混淆,加固等.自己对类文件进行加密,并自定义类加载器也是一种办法: 首先我们的代码打包编译之后会变成难以读懂的二进制字节码,并且变成.class文件.但是简单的APP编译出来之后可以被反编译,甚至你写的

Android进阶:自定义类加载器加载加密类文件

之前面试的时候有许多面试官问类加载器相关的问题,所以这是一个很重要的知识点.而且对于高级Android研发来讲,懂得更多类加载相关的东西,对开发也会有很多的帮助,比如热更新,类加密等.其实笔者对类加密比较感兴趣,就稍稍调研了一下.类加密的其实是为了防止APP被反编译,防止反编译的方法有很多种,比如混淆,加固等.自己对类文件进行加密,并自定义类加载器也是一种办法: 首先我们的代码打包编译之后会变成难以读懂的二进制字节码,并且变成.class文件.但是简单的APP编译出来之后可以被反编译,甚至你写的

JVM 类的加载机制

在对类的实例化之前.JVM 一般会先进行初始化 主要经过如下几个阶段: 1.加载                       类加载的第一阶段,类加载时机有两个: 1.预加载:当虚拟机启动时,会预加载HOME/lib下的rt.jar里的.class文件 里面包括java.lang.*.java.util.*.java.io.*. 还有加载当前启动类并调用main方法 2.运行时加载: 首先会去内存中找.class文件有没被加载,没有的话就会按照类的全限定名进行加载 加载(load)阶段. 1.1

【转】JVM类的加载与初始化

版权声明: 本文原创作者:书呆子Rico 作者博客地址:http://blog.csdn.net/justloveyou_/ 摘要: 我们知道,一个.java文件在编译后会形成相应的一个或多个Class文件,这些Class文件中描述了类的各种信息,并且它们最终都需要被加载到虚拟机中才能被运行和使用.事实上,虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型的过程就是虚拟机的类加载机制.本文概述了JVM加载类的时机和生命周

深入了解java虚拟机---类加载机制----加载

加载是类加载的一个阶段.不要弄混淆了 这一阶段主要做了下面三件事.1.通过一个类的全限定名获取此类的二进制流 2.将这个二进制流代表的静态存储结构转化为方法区的运行时数据结构 3.在内存中生成java.lang.Class对象,作为访问入口 .通过一个类的全限定名获取此类的二进制流:这一步说的不明确,要怎样获取呢.java虚拟机没有指明.所以就产生了很多种获取方法 1.从zip,jar,war包获取 2.从网络中获取 3.运行时生成,如动态代理 4.有其他文件生成 如jsp 5.从数据库中获取,

类加载器加载配置文件

//在resource文件夹下创建一个db.properties文件 里面存2个值: //加载该文件内容: @RunWith(SpringRunner.class) @SpringBootTest public class JestTest { @Test public void getProperties() throws IOException { //通过2种方式获取类加载器,然后可以将配置文件加载进行进来,一个是Thread类获取,另一个是字节码对象获取 ClassLoader load