首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么使用引导类加载器(bootclasspath)加载的类不包含注释

引导类加载器是Java虚拟机内置的类加载器,它负责加载Java核心类库,如java.lang包中的类。由于引导类加载器是虚拟机的一部分,它是用C++实现的,无法通过Java代码直接访问。

当使用引导类加载器加载类时,它只会加载Java核心类库中的类,而不会加载应用程序中的类或第三方库中的类。这是因为引导类加载器的加载路径是固定的,它只会搜索Java核心类库所在的路径,而不会搜索其他路径。

注释是Java源代码中的一种元数据,它提供了对代码的解释和说明。注释在编译后会被丢弃,不会包含在生成的字节码中。因此,当使用引导类加载器加载类时,由于注释是源代码的一部分,它们不会包含在加载的类中。

总结起来,使用引导类加载器加载的类不包含注释,是因为引导类加载器只加载Java核心类库中的类,而注释是源代码的一部分,在编译后会被丢弃,不会包含在生成的字节码中。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

VM加载过程是通过引导加载

加载过程 JVM加载过程是通过引导加载(bootstrap class loader)创建一个初始(initial class)来完成,这个是由JVM具体实现指定。...验证# 确保class文件中字节流包含信息,符合当前虚拟机要求,保证这个被加载class正确性,不会危害到虚拟机安全。...当虚拟机启动时,用户需要定义一个要执行 (包含 main 方法那个),虚拟机会先初始化这个。...AppClassLoader加载为ExtensionClassLoader ,ExtensionClassLoader 加载为null,当父加载为null时,会使用启动加载 BootstrapClassLoader...为什么使用双亲委派模型# 试想一种情况,我们在项目目录下,手动创建了一个java.lang 包,并在该包下创建了一个Object,这时候我们再去启动Java程序,原生Object会被篡改吗?

66030

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

文章目录 一、加载 二、加载双亲委托机制 一、加载 ---- Java 虚拟机 ClassLoader 加载 : Bootstrap ClassLoader : 启动加载 , 该 加载由...ClassLoader 应用加载 Application ClassLoader 自定义加载 Custom ClassLoader 在双亲委托机制中 , 上层加载 是 下层加载 ...加载任务 之后 , 也会 委托 父 加载 执行 ; 委托操作 , 会一直传递到 最顶层 启动加载 Bootstrap ClassLoader ; 如果 启动加载 Bootstrap...; 同理 , 父 委托 给子类 加载任务 , 如果 子类加载 可以完成加载 , 成功返回 , 如果子类加载无法完成加载 , 就再次 将 加载任务 委托给 子类子类 , 继续向下传递 ;...无法 被替代 , 系统只能由 启动加载 Bootstrap ClassLoader 加载 , 应用加载 加载被篡改 Java 核心是无效 ;

84030

加载加载过程

加载子系统作用 加载子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定文件标识。...补充:加载class文件方式 从本地系统中直接加载 通过网络获取,典型场景:Web Applet 从zip压缩包中读取,成为日后jar、war格式基础 运行时计算生成,使用最多是:动态代理技术...Class文件字节流中包含信息符合当前虚拟机要求,保证被加载正确性,不会危害虚拟机自身安全。...这里包含用final修饰static,因为final在编译时候就会分配了,准备阶段会显式初始化; 这里不会为实例变量分配初始化,变量会分配在方法区中,而实例变量是会随着对象一起分配到Java...由于Java采用是懒加载策略,只有当我们需要用到这个时候才会去加载他  初始化阶段就是执行构造方法()过程。

15930

加载方法_JS加载

==c2); // true 同一个加载加载同名,第一次加载加载会缓存到加载缓存,再次加载直接在缓存读取,两次加载是同一个 //直接获取加载...} } 在应用程序中,默认我们获取上下文类加载、类型对象getClassLoader都是采用同一个应用程序加载在第一次被加载后会缓存到加载缓存中,由于是同一个加载此时同名不能被多次加载...编写自定义加载: 继承ClassLoader; 重写findClass方法在指定路径下进行加载,得到字节数组,然后使用defineClass根据字节数组生成字节码文件 也就是class文件;...> c3 = classLoader2.loadClass("Goods"); System.out.println(c1==c3); //false 使用不同加载对同一个进行加载...",e); } } } 使用自定义加载,创建多个加载对象去加载同一个,会得到多个类型对象。

5.8K10

java加载过程和加载分析

再次之前我想补充一个名词解释,加载:虚拟机把  实现 加载阶段中“通过一个全限定名来获取描述此类二进制字节流” 这个过程代码称为加载 1....: 1.先检查此类是否被加载过,若没有加载则调用父加载loadClass()方法, 2.若父加载为空,则默认使用启动加载作为父加载, 3.若父加载失败,会抛出一个异常,然后再调用自己findClass...()方法来进行加载; 结合第一步加载可以这么理解,  1.首先要启动→   启动加载,这时会调用启动加载加载,但由于启动加载时所有加载, 所以其父加载为空(相当于Object...是所有,这种感脚~),然后它就会调用自己findClass方法来自启动加载 ; 2.标准扩展加载启动时就会借助其父 启动加载 作为父加载 来启动了; 3.系统加载启动时就会借助其父...3.初始化一个时候,如果其父还没有被初始化,那么会先去初始化其父; 4.当 JVM 启动时,用户需要指定一个要执行包含static void main(String 【】args)那个

1.5K80

自定义加载加载jar包_加载可见性

大家好,又见面了,我是你们朋友全栈君。...spring根本不会去管自己被放在哪里,它统统使用TCCL来加载,而TCCL默认设置为了WebAppClassLoader,也就是说哪个WebApp应用调用了spring,spring就去取该应用自己...这在真正理解线程上下文类加载(多案例分析)中已有详细描述。 因此,为了使spring使用自定义加载进行加载,需要开一个线程,将这个线程加载设置为自定义加载。...; }; FutureTask task=new FutureTask(callable); Thread thread=new Thread(task); // 设置线程上下文类加载...本站仅提供信息存储空间服务,拥有所有权,承担相关法律责任。如发现本站有涉嫌侵权/违法违规内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

77520

jvm加载(classloader)及加载过程

注意:加载即可以由引导加载或自定义加载去完成加载。...(); System.out.println(classLoader); //获取strng 加载 null(使用引导加载)java核心都是使用该种加载方式...18b4aac2 sun.misc.Launcher$ExtClassLoader@14ae5a5 null sun.misc.Launcher$AppClassLoader@18b4aac2 null 个人理解:引导加载和自定义加载...,自定义就像你自己手机随时想用就用,或者你家人想用直接向你借就OK了,但是引导就像某个大领导个人手机,你跟你家人一般是无法直接借到(基本不可能)。...此外加载还采用了cache机制,也就是如果 cache中保存了这个Class就直接返回它,如果没有才从文件中读取和转换成Class,并存入cache,这就是为什么我们修改了Class但是必须重新启动JVM

1.8K21

java加载过程和加载分析

再次之前我想补充一个名词解释,加载:虚拟机把  实现 加载阶段中“通过一个全限定名来获取描述此类二进制字节流” 这个过程代码称为加载 1....: 1.先检查此类是否被加载过,若没有加载则调用父加载loadClass()方法, 2.若父加载为空,则默认使用启动加载作为父加载, 3.若父加载失败,会抛出一个异常,然后再调用自己findClass...()方法来进行加载; 结合第一步加载可以这么理解,  1.首先要启动→   启动加载,这时会调用启动加载加载,但由于启动加载时所有加载, 所以其父加载为空(相当于Object...是所有,这种感脚~),然后它就会调用自己findClass方法来自启动加载 ; 2.标准扩展加载启动时就会借助其父 启动加载 作为父加载 来启动了; 3.系统加载启动时就会借助其父...3.初始化一个时候,如果其父还没有被初始化,那么会先去初始化其父; 4.当 JVM 启动时,用户需要指定一个要执行包含static void main(String 【】args)那个

58150

Javaweb-加载-加载了解入门

加载分类 加载有三个分类,以下三分工明确,负责不同加载引导加载 这个分类主要是加载,例如jre下面的lib文件夹中rt.jar中加载进JVM内存。...系统加载 这分类就是加载一些应用下,例如我们写一个web项目,我们使用到很多其他第三方jar包,这些就是系统加载来完成加载。还有我们自己写代码文件,也是系统加载完成这操作。...这三个分类关系是,系统加载上层是扩展加载,扩展加载上层是引导加载引导加载是老大,没有上层。...3) 扩展加载也不管,直接通知引导加载,想让引导加载去执行加载。...5) 如果引导加载发现A不是自己管辖范围,返回null给扩展。

43800

Java加载

分类 系统自带加载 启动加载(BootStrap) c++编写 加载核心库 java.* 3.拓展加载 (Extension) java编写 加载拓展库 javax.* 4.应用程序加载...(AppClassLoader)java编写 加载程序所在目录 5.用户自定义加载 自定义加载 java编写 定制化加载 我们先了解2个方法 第一个方法 findClass /**...必须先解析Class才能使用。 大白话就是,将字节流转换为,找不到就报错!子类应该覆盖这个方法 第二个方法 defineClass protected final Class<?...我们通过加载加载这个文件!我们通过加载创建该实例!他就会打印构造函数中一句话!废话不多说我们直接上图吧!...然后开始编写我们自己加载!

34020

Flink加载

动态用户代码:这些是动态提交作业 JAR 文件中包含所有(通过 REST、CLI、Web UI)。 它们按作业动态加载(和卸载)。...这些 JVM 在 Java 路径中具有用户代码。 这意味着在这种情况下,作业涉及动态加载。...反向加载加载解析顺序 在涉及动态加载设置中(插件组件、会话设置中 Flink 作业),通常有两个加载层次结构:(1)Java 应用程序加载,它包含路径中所有,以及(2)动态插件...反向加载好处是插件和作业可以使用与 Flink 核心本身不同库版本,这在不同版本兼容时非常有用。...这意味着 com.foo.X 多个版本已被不同加载加载,并且该类类型试图相互分配。 一个常见原因是库与 Flink 反向加载方法兼容。

2.2K20

加载加载Class文件过程

加载加载Class文件过程 jdk8和9有一些区别,这里以8为准,9作为最后扩充 加载是用于加载class文件,我们从这里开始介绍 前言 因为底层硬件不同,如果在不同硬件上都要做一次适配化无疑是令人奔溃...java文件或者文件已经损坏,无法进行加载。...之外,所有的都应当有父就是这里验证 字节码验证 保证不会出现类似于“在操作 栈放置了一个int类型数据,使用时却按long类型来加载入本地变量表中”这样情况。...执行构造方法 加载 参考上一篇文章中 保证Java程序稳定运作 它确保了内存中唯一性 先看层级结构 写代码验证 public class Main { public...因为BootstrapClassLoader是通过C/C++实现,不存在JVM体系中所以输出为null, 加载器具有登记制度但是并没有继承关系,以组合方式复用父加载功能 附加 JDK9中用平台加载替代了扩展加载功能

1.2K20

【Android 逆向】加载 ClassLoader ( 加载 Android 组件加载 | 双亲委派机制实例分析 )

文章目录 一、加载 Android 组件加载 二、加载 Android 组件双亲委派机制实例 一、加载 Android 组件加载 ---- 打印 Activity 组件 加载...及 该 加载 加载 : package com.example.classloader_demo; import androidx.appcompat.app.AppCompatActivity...Android 组件双亲委派机制实例 ---- Activity 加载分析 : Activity 组件加载是 dalvik.system.PathClassLoader , dalvik.system.PathClassLoader...加载节点是 java.lang.BootClassLoader 加载 , java.lang.BootClassLoader 是根节点 加载 ; 双亲委派机制 : 在双亲委派机制中..., 加载任务 , 先被分配给 PathClassLoader , PathClassLoader 处理 , 将任务委派给父节点 BootClassLoader; BootClassLoader

26630

OSGi加载架构和特性,对比其他加载优势

加载层次结构: OSGi引入了加载层次结构,包括了系统加载、扩展加载和模块加载。每个模块都有自己独立加载,它只加载属于模块和资源,并且可以隔离不同模块之间和资源。...模块隔离性: OSGi加载架构提供了模块之间隔离性。每个模块都有自己独立加载,它只加载属于模块和资源。这种隔离性可以防止模块之间冲突和版本冲突。...OSGi加载相比其他加载优势模块化架构: OSGi加载架构是为模块化设计,使得应用程序可以按需加载和管理模块。与传统加载相比,它更适合构建大型和复杂应用程序。...版本管理: OSGi使用模块版本来标识和管理不同模块。这使得可以同时存在多个相同模块不同版本,并且可以根据需要动态地加载、卸载和切换模块。这种版本管理能力使得应用程序更易扩展和维护。...模块隔离性: OSGi加载架构提供了模块之间隔离性。每个模块有自己独立加载,它只加载属于模块和资源。这种隔离性可以防止模块之间冲突和版本冲突,提高了应用程序稳定性和可靠性。

32261

jvm之java加载机制和加载(ClassLoader)详解

加载 读取二进制内容 ③ 验证 yan验证class文件格式规范,语义分析,引用验证,字节码验证。必须有一定规范。不能随意进行加载,不像咱们普通人一句话:不干净吃了没病。...用户应用程序class-path 或者java命令运行时参数 -cp(开发人员写代码,对应存放在哪里,JAVA是怎么知道为什么用eclipse和idea右键可以直接跑了,其实就是在底层指定目录地址...识别方式:ClassLoader instance id + PackageName + ClassName 验证方式:使用加载,对同一个class不同版本,进行多次加载,检查是否加载到最新代码...首先不会自己去尝试加载,而是把这个请求委派给父加载去完成,每一个层次加载都是如此,因此所有的加载请求都会传给上层启动加载。...但是有了双亲委派模型,他直接找他上级加载,上级一直是老直接用他了,也就是说本身就是个败类肯定不会用自己东西,肯定用上级,所以改变HelloWorld不会被重新加载

1.5K20

jvm之java加载机制和加载(ClassLoader)详解

除此之外,开发者可以通过继承ClassLoader基来创建自己加载。 通过使用不同加载,可以从不同来源加载二进制数据,通常有如下几种来源。...3.初始化 初始化是为静态变量赋予正确初始值,准备阶段和初始化阶段看似有点矛盾,其实是矛盾,如果类中有语句:private static int a = 10,它执行过程是这样,首先字节码文件被加载到内存后...JVM预定义有三种加载,当一个 JVM启动时候,Java开始使用如下三种加载: 1)根加载(bootstrap class loader):它用来加载 Java 核心,是用原生代码来实现...由于引导加载涉及到虚拟机本地实现细节,开发者无法直接获取到启动加载引用,所以不允许直接通过引用进行操作。...请求使用加载去载入目标,如果载入成功则跳至第8步,否则接着执行第5步。 请求使用加载去载入目标,如果载入成功则跳至第8步,否则跳至第7步。

70020

JVM加载分类

JVM支持两种类型加载 。...,但是Java虚拟机规范却没有这么定义,而是将所有派生于抽象ClassLoader加载都划分为自定义加载 无论加载类型如何划分,在程序中我们最常见加载始终只有3个,如下所示 为什么...ExtClassLoader 和 AppClassLoader 都属于自定义加载 规范定义:所有派生于抽象ClassLoader加载都划分为自定义加载 1.虚拟机自带加载 1.1 启动加载...(引导加载) 启动加载引导加载,Bootstrap ClassLoader ) 这个加载使用C/C++语言实现,嵌套在JVM内部 它用来加载Java核心库(JAVA_HOME /...,没有父加载 加载扩展和应用程序加载,并作为他们加载(当他俩爹) 出于安全考虑,Bootstrap启动加载加载包名为java、javax、sun等开头 1.2 扩展加载

23430

JVM中加载

加载   把加载阶段中"通过一个全限定名来获取描述此类二进制字节流"这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要,实现这个动作代码模块称为加载。...} else { // 使用引导加载 c = findBootstrapClassOrNull(name);...(rj.jar) ,无法被java程序直接是使用 2 扩展加载Extension ClassLoader 负责加载 \lib\ext目录中或者被java.ext.dirs指定目录下库...,程序员可以直接使用加载 3 应用程序加载 Application ClassLoader 也称系统加载,负责加载用户路径上所指定库,一般是程序默认加载 ?...,它首先不会自己去尝试加载这个,而是把这个请求委派给父加载完成,每一个层次加载都是如果,因此所有的加载请求最终都应该传递到顶层启动加载中 当父加载反馈无法加载该类时(搜索范围中没有找到所需

44160

灵活加载OSGI

涉及某个具体Package时,各个Bundle加载都是平级关系,只有具体使用到某 个Package和Class时候,才会根据Package导入导出定义来构造Bundle间委派和依赖。...如果一个存在于Bundle库中但是没有被Export,那么这个Bundle加载能找到这个, 但不会提供给其他Bundle使用,而且OSGi框架也不会把其他Bundle加载请求分配给这个...这种网状加载架构在带来更优秀灵活性同时,也可能会产生许多新隐患。 加载时可能进 行查找规则如下:·以java.*开头,委派给父加载加载。...否则,委派列表名单内,委派给父加载加载。 否则,Import列表中,委派给Export这个Bundle加载加载。...否则,查找当前BundleClasspath,使用自己加载加载。 否则,查找是否在自己Fragment Bundle中,如果是则委派给Fragment Bundle加载加载

61930
领券