首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏韩曙亮的移动开发专栏

    【Android 逆向】加载 ClassLoader ( 启动加载 | 扩展加载 | 应用加载 | 加载的双亲委托机制 )

    文章目录 一、加载 二、加载的双亲委托机制 一、加载 ---- Java 虚拟机 ClassLoader 加载 : Bootstrap ClassLoader : 启动加载 , 该 加载由 程序才能开始执行 ; 二、加载的双亲委托机制 ---- 加载级别 : 权限 / 重要性 从高到低排列 ; 启动加载 Bootstrap ClassLoader 扩展加载 Extention ClassLoader 应用加载 Application ClassLoader 自定义加载 Custom ClassLoader 在双亲委托机制中 , 上层的加载 是 下层加载 的父 ; 加载的双亲委托机制 : 加载 ClassLoader 接收到 加载任务 之后 , 自己不会先进行加载 , 反而将该 加载任务 委托 给 父加载 执行 ; 父加载 接收 到 该 加载任务 之后 , 也会 委托 父的父 加载 执行 ; 委托操作 , 会一直传递到 最顶层的 启动加载 Bootstrap ClassLoader ; 如果 启动加载 Bootstrap

    1.4K30编辑于 2023-03-30
  • 来自专栏Java面试

    加载 超详解:什么是加载加载作用及应用场景,加载时机,加载的完整过程,加载分类

    【理解】4.1 概述4.2 JDK8及之前的版本4.2.1 启动加载4.2.2 扩展加载和应用程序加载扩展加载应用程序加载4.3 JDK9之后的加载4.4 ClassLoader 是扩展加载AppClassLoader是应用程序加载DelegatingClassLoader是用来提升反射效率的加载4.2.1 启动加载启动加载(Bootstrap ClassLoader ,说明自己拓展的Jar包被加载了应用场景:在企业中开发一些偏底层的基础,所有用到jdk的项目都需要使用这些基础,此时就通过启动加载加载用户jar包4.2.2 扩展加载和应用程序加载扩展加载和应用程序加载都是 避免了核心被应用程序重写并覆盖的问题,提升了安全性)加载某一个,先委托上一级的加载进行加载,如果上级加载也有上级,则会继续向上委托,如果该类委托上级没有被加载,子加载尝试加载该类应用程序加载的父加载是扩展加载 ,扩展加载的父加载是启动加载

    1.3K21编辑于 2024-09-18
  • 加载

    用户可以自己定义加载加载。 逻辑是从自定义加载一直往上父加载递归调用,直到扩展加载发现没有parent了,就会去查看引导加载加没加载过该类。 加载顺序应该是先查看引导加载是否加载,再由父加载尝试加载,最后是子类加载自己加载。 双亲委派:向上委派过程:第一步: 将自定义加载挂载到应用程序加载;第二步: 应用程序加载将请求委托给扩展加载;第三步: 扩展加载将请求委托给启动加载。 向下委派的加载过程(报ClassNotFund的过程):第一步: 启动加载加载路径下查找并加载Class文件,如果没有找到就交给扩展加载加载 第二步:扩展加载在它的加载路径下查找并加载Class

    31200编辑于 2024-03-25
  • 来自专栏足球是圆的

    加载

    加载虽然只用于实现加载动作,但它在Java程序中起到的作用却远远不限于加载阶段。比如判断两个是否“相等”,只有两个是由同一个加载加载的前提下才有意义。 如果应用程序没有自定义的加载,一般默认都是用这个加载。   * 自定义加载(User ClassLoader),用户自己定义的加载。 双亲委派模型 ?    加载双亲委派模型要求除了顶层的启动加载外,其它的加载都应该有自己的父加载。这里的加载之间的父子关系不是通过继承实现的,都是使用组合关系来复用父加载的代码。    加载双亲委派模型的工作过程:如果一个加载收到加载的请求,它首先把这个请求委派给父加载去完成,每一层次的加载都是如此,因此所有的加载请求都应该传到顶层的启动加载中,只有当父加载反馈自己无法完成这个加载请求时 由于只能向上委派,到了启动加载后不能往下询问,即顶层的加载,无法访问底层的加载加载

    75130发布于 2019-09-24
  • 来自专栏刘晓杰

    加载

    加载基本概念 顾名思义,加载(class loader)用来加载 Java 到 Java 虚拟机中。 加载的代理模式 加载在尝试自己去查找某个的字节代码并定义它时,会先代理给其父加载,由父加载先去尝试加载这个,依次类推。 加载的过程 在前面介绍加载的代理模式的时候,提到过加载会首先代理给其它加载来尝试加载某个。这就意味着真正完成加载工作的加载和启动这个加载过程的加载,有可能不是同一个。 也就是说,哪个加载启动加载过程并不重要,重要的是最终定义这个加载。两种类加载的关联之处在于:一个的定义加载是它引用的其它的初始加载加载在成功加载某个之后,会把得到的 java.lang.Class的实例缓存起来。下次再请求加载该类的时候,加载会直接使用缓存的的实例,而不会尝试再次加载

    75030发布于 2019-02-21
  • 来自专栏Vincent-yuan

    加载

    一个非数组加载阶段(加载阶段获取的二进制字节流的动作)是可控性最强的阶段,这一步我们可以去自定义加载去控制字节流的获取方式(重写一个加载的 loadClass() 方法)。 数组类型不通过加载创建,它由 Java 虚拟机直接创建。 所有的都由加载加载加载的作用就是将 .class文件加载到内存。 AppClassLoader(应用程序加载) :面向我们用户的加载,负责加载当前应用 classpath 下的所有 jar 包和。 当父加载无法处理时,才由自己来处理。当父加载为 null 时,会使用启动加载 BootstrapClassLoader 作为父加载。   每个加载都有一个父加载,我们通过下面的程序来验证。

    61540编辑于 2022-05-06
  • 来自专栏国产程序员

    什么是加载加载有哪些?

    实现通过的全限定名获取该类的二进制字节流的代码块叫做加载。 启动加载无法被Java程序直接引用,用户在编写自定义加载时,如果需要把加载请求委派给引导加载去处理,那直接使用null代替即可。 由于扩展加载是由Java代码实现的,开发者可以直接在程序中使用扩展加载加载Class文件。 由于应用程序加载是ClassLoader中的getSystem-ClassLoader()方法的返回值,所以有些场合中也称它为“系统加载”。 它负责加载用户路径(ClassPath)上所有的库,开发者同样可以直接在代码中使用这个加载。如果应用程序中没有自定义过自己的加载,一般情况下这个就是程序中默认的加载

    1.1K20编辑于 2022-11-16
  • 来自专栏Java项目实战

    什么是加载加载有哪些?

    加载采用了双亲委派机制(Parent-Delegate Model),它将加载过程委派给父加载,只有在父加载无法找到所需时,才会尝试自己去加载加载的种类Java中有三种主要的加载,分别是:Bootstrap Class Loader(引导加载):它是JVM自身的一部分,负责加载Java的核心库,如java.lang包中的。 此外,还有一种特殊的加载:用户自定义加载:这种类加载由开发人员自行编写,用于自定义加载一些特殊的加载的示例代码下面通过示例代码来演示加载的使用。 总结加载是Java虚拟机中的一个重要组成部分,它负责将Java文件加载到内存中,并在运行时动态链接和验证这些。Java中有三种主要的加载,分别是引导加载、扩展加载和应用加载加载根据双亲委派机制进行加载,保证了加载的一致性和安全性。在实际开发中,了解加载的工作原理对于解决加载相关的问题非常重要。希望本文对您理解加载有所帮助!

    75940编辑于 2023-07-13
  • 来自专栏java学习java

    加载加载过程

    加载子系统作用 加载子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识。 加载信息存放于一块称为方法区的内存空间。 除了的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射) 加载ClasLoader角色 class file存在于本地硬盘上 由于Java采用的是懒加载策略,只有当我们需要用到这个的时候才会去加载他  初始化阶段就是执行构造方法<clinit>()的过程。 此方法不需定义,是javac编译自动收集中的所有变量的赋值动作和静态代码块中的语句合并而来。 构造方法中指令按语句在源文件中出现的顺序执行。 <clinit>()不同于的构造

    71530编辑于 2023-10-15
  • 来自专栏全栈程序员必看

    jvm怎么加载_jvm加载

    为什么要自定义加载 原因: 1、存放在自定义路径上的,需要通过自定义加载加载。 【注意:AppClassLoader加载classpath下的】 2、不一定从文件中加载,也可能从网络中的流中加载,这就需要自定义加载去实现加密解密。 如何实现自定义加载 实现自定义加载有以下两步: 1、继承ClassLoader 2、重写findClass,在findClass里获取的字节码,并调用ClassLoader中的defineClass 如下:是一个自定义 的加载 public static class MyClassLoader extends ClassLoader{ @Override protected 一直提交给启动加载加载,通过他加载加载到的永远是/lib下面的java.lang.String 3、在这个自己写的中写上main方法 public static void main(String

    81110编辑于 2022-10-29
  • 来自专栏全栈程序员必看

    java加载是什么_加载有几种

    加载是有了解吗? 解析:底层原理的考察,其中涉及到加载的概念,功能以及一些底层的实现。 答:顾名思义,加载(class loader)用来加载 Java 到 Java 虚拟机中。 一般来说,Java 虚拟机使用 Java 的方式如下:Java 源程序(.java 文件)在经过 Java 编译编译之后就被转换成 Java 字节代码(.class 文件)。 加载负责读取 Java 字节代码,并转换成 java.lang.Class的一个实例。每个这样的实例用来表示一个 Java

    62410编辑于 2022-09-22
  • 来自专栏全栈程序员必看

    加载的方法_JS加载

    ==c2); // true 同一个加载加载同名的,第一次加载加载会缓存到加载的缓存,再次加载直接在缓存读取,两次加载的是同一个 //直接获取加载 } } 在应用程序中,默认我们获取上下文类加载、类型对象getClassLoader都是采用的同一个应用程序加载在第一次被加载后会缓存到加载的缓存中,由于是同一个加载此时同名的不能被多次加载 ,且应用程序加载只能加载classpath下的。 如果我们想加载自定义路径下的,需要用到自定义加载,可以去指定路径下加载,且通过创建多个加载对象,加载的同名相互隔离,也就是说同名可以被多个自定义加载对象加载。 ",e); } } } 使用自定义加载,创建多个加载对象去加载同一个,会得到多个类型对象。

    7.6K10编辑于 2022-10-04
  • 来自专栏Python程序员杂谈

    java加载加载机制

    在沙箱组件中包括装载结构,加载体系结构也是java沙箱的第一道防线,因为程序都是通过加载才能够加载到JVM中的。   加载有三方面的作用: 1. 它防止了恶意代码去干涉善意代码 2. 其中一个大家所熟悉的词就是“双亲委派机制”,所谓“双亲委派机制”,就是某个特定的加载在接到加载的请求时,首先将加载任务委托给父加载,依次递归,如果父加载可以完成加载任务,就成功返回;只有父加载无法完成此加载任务时  扩展加载(extensions class loader):它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载在此目录里面查找并加载 Java 。  系统加载(system class loader):它根据 Java 应用的路径(CLASSPATH)来加载 Java 。一般来说,Java 应用的都是由它来完成加载的。 关于java加载机制推荐大家看这篇文章《深入探讨 Java 加载》,IBM文档,写的很详细。

    1.4K10发布于 2019-02-28
  • 来自专栏精讲JAVA

    加载详解

    当JVM启动时,会形成由三个加载组成的初始加载层次结构 1、启动加载BootstrapClassLoader: 是嵌在JVM内核中的加载,该加载是用C++语言写的,主要负载加载 上述三种加载的层次关系如下: ? 注意:加载的体系并不是“继承”体系,而是委派体系,大多数加载首先会到自己的parent中查找或者资源,如果找不到才会到自己本地查找。 加载的委托行为动机是为了避免相同的加载多次。 每一个层次的加载都是如此。 因此所有的加载请求都应该传递到最顶层的启动加载中,只有到父加载反馈自己无法完成这个加载请求(在它的搜索范围没有找到这个)时,子类加载才会尝试自己去加载。 ,若没有加载则调用父加载的loadClass方法,若父加载不存在,则使用启动加载

    90650发布于 2018-01-30
  • 来自专栏java架构计划训练营

    加载介绍

    加载 系统加载(System ClassLoader):负责java-classpath或-D java.class.path所指的目录下的与jar包装入工作,是常用的加载 扩展加载(Extension 编写的,是JVM自带的加载,负责Java平台核心库,用来装载核心库。 该加载无法直接获取 自定义加载、系统加载、扩展加载、引导加载,自左向右检查是否已装载,自右向左尝试加载 示 public class Test07 { public static = ClassLoader.getSystemClassLoader(); System.out.println(systemClassLoader); //获取系统加载的父加载 ); //获取扩展加载的父加载--->根加载(C/c++) ClassLoader parent1 = parent.getParent();

    38620编辑于 2022-06-14
  • 来自专栏Android程序Shape使用总结!

    Android 加载

    加载 把实现加载阶段中的“通过一个的全限定名来获取描述此类的二进制字节流”这个动作的代码模块称为“加载”。 的唯一性 对于任意一个,都需要由加载它的加载和这个本身一同确立其在Java虚拟机中的唯一性。 即使两个来源于同一个 Class 文件,被同一个虚拟机加载,只要加载它们的加载不同,那这两个也不相等。 双亲委托机制 如果一个加载收到了加载的请求,它首先不会自己去尝试加载这个,而是把这个请求委派给父加载去完成,每一个层次的加载都是如此,因此所有的加载请求最终都应该传送到顶层的启动加载中 ,只有当父加载反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需的)时,子加载才会尝试自己去加载

    71830编辑于 2021-12-12
  • 来自专栏Liusy01

    加载ClassLoader

    需要注意的是,即使是同一个加载不一样,就必定不相等。 例如自定义了一个加载跟JVM默认加载进行比对 /** *自定义加载 */ class MyClassLoader extends ClassLoader { //加载需要用到包名 Java的3种加载 1、Bootstrap ClassLoader,顶级加载。 启动加载加载JAVA_HOME/jre/lib下的核心库,也是所有加载的顶级父,由c++所写。 3、Application ClassLoader,应用程序加载 系统默认加载,负责加载用户所在路径的信息。 JVM的双亲委派模型(保证父加载会先加载) 工作流程:如果一个加载收到了加载的请求,首先不会自己去尝试加载此类,而是把请求委派给父加载去完成,每一个层次的加载都是如此,因此所有的加载请求都会传送到顶层的启动加载

    93820发布于 2020-09-01
  • 来自专栏向治洪

    加载原理

    1.加载过程   JVM将加载过程分为三个步骤:装载(Load),链接(Link)和初始化(Initialize)链接又分为三个步骤,如下图所示: 1) 装载:查找并加载的二进制数据; 2 首先如果由编译生成的class文件,它肯定是符合JVM字节码格式的,但是万一有高手自己写一个class文件,让JVM加载并运行,用于恶意用途,就不妙了,因此这个class文件要先过验证这一关,不符合的话不会让它继续执行的 的初始化步骤:         1)如果这个还没有被加载和链接,那先进行加载和链接         2)假如这个存在直接父,并且这个还没有被初始化(注意:在一个加载中,只能初始化一次 3.加载        加载指的是将的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个这个的java.lang.Class对象,用来封装在方法区的对象 5)将Java源文件动态编译为.class文件(服务) 4.加载 来自http://blog.csdn.net/cutesource/article/details/5904501 JVM

    94980发布于 2018-02-01
  • 来自专栏安卓圈

    ClassLoader 加载

    *Java中的ClassLoader* 1.系统加载包括3种:   1)Bootstrap ClassLoader(引导加载)   C/C++代码实现的加载,用于加载指定的JDK的核心库,比如 (应用程序加载)   Java中的实现为AppClassLoader 2.Custom ClassLoader(自定义加载)通过继承java.lang.ClassLoader的方式来实现自己的加载 ,ExtClassLoader和AppClassLoader都是在Launcher中进行初始化的 4.加载查找Class所采用的是双亲委托模式,好处是   1)避免重复加载,如果已经加载过一次Class ,可以直接读取已经加载的Class   2)更加安全,无法自定义来替代系统的 *Android中的ClassLoader* 1.系统加载包括3种:   1)BootClassLoader   Android *Java和Android的ClassLoader的区别* 1.Java的引导加载是由C++编写的,Android中的引导加载则是由Java编写的 2.Android的继承关系要比Java继承关系复杂一些

    1K40发布于 2019-09-26
  • 来自专栏各类技术文章~

    Android 加载

    加载 把实现加载阶段中的“通过一个的全限定名来获取描述此类的二进制字节流”这个动作的代码模块称为“加载”。 的唯一性 对于任意一个,都需要由加载它的加载和这个本身一同确立其在Java虚拟机中的唯一性。 即使两个来源于同一个 Class 文件,被同一个虚拟机加载,只要加载它们的加载不同,那这两个也不相等。 双亲委托机制 如果一个加载收到了加载的请求,它首先不会自己去尝试加载这个,而是把这个请求委派给父加载去完成,每一个层次的加载都是如此,因此所有的加载请求最终都应该传送到顶层的启动加载中 ,只有当父加载反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需的)时,子加载才会尝试自己去加载

    67400编辑于 2021-12-06
领券