21.深入理解java反射(运行时校验读取class文件信息的字段,方法,构造方法等)
https://www.cnblogs.com/luoxn28/p/5686794.html
RTTI在编译知道此类型去验证,运行时让我们知道是什么类型,
反射打破这个规律在运行时,去验证加载,匿名对象的类信息就在运行时被完全确定下来,而在编译时不需要知道任何事情。
reflect类库一起对反射的概念进行了支持,该类库包含了Field字段、Method方法以及Constructor构造器类(每个类都实现了Member接口)。JVM在运行时创建这些类型的对象。
对RTTI(传统的加载class对象)来说,编译器在编译时打开和检查.class文件(也就是可以用普通方法调用对象的所有方法);而对于反射机制来说,.class文件在编译时是获取不到的,所以是在运行时打开和检查.class文件
22.深入理解类加载机制和生命周期
类加载机制:把数据从class文件加载到内存,并对这内存数据进行-校验,转换解析,初始化,最终形成可以被jvm直接使用的类型对象。
运行期间完成:类型加载,连接,初始化。
class文件:一串二进制字节流。
类加载生命周期包括(把class文件加载初始化到jvm内存里):
加载:1获取要加载的类二进制字节流(class文件),2这个字节流按照jvm所需要的格式(数据结构)放到方法区中,3在内存中实例化class类的对象放在方法区里,这个对象作为方法区访问具体数据结构访问入口。
连接-验证:class文件可能不仅java再用,所有对于此文件的必须验证,
对文件格式(内容中的开头标识,常量池中常量类型,常量索引指向,符合utf8等,以上是验证字节流,通过验证,之后验证方法区的存储结构),
元数据(是否有父类,是否被继承final修饰,是否实现父类接口实现方法,类的字段是否与父类产生矛盾),
字节码(对垒方法体校验,类型转换,类型不被方法外使用),
符号引用验证(引用中是否找到引用的类,private是否被当前类访问)
连接-准备:为类变量分配内存(不包括实例变量),并设置初始值。stati修饰的变量将在方法区中进行分配,比如 public status int value =123;
连接-解析:类或接口的解析,字段解析,类方法解析,接口方法解析,jvm在常量池的引用替换为直接引用的过程。
初始化:类先初始化父类,<clinit>方法(static方法块生成的<clinit>方法),构造器初始化,
如果是接口不会先执行父类的<clinit>方法,只有父类定义时才会初始化。
jvm保证<clinit>多线程访问方法加锁同步,其中一个线程执行完,其他线程也不会唤醒,因为一个类型只会初始化一次。
使用:
卸载:
23.深入理解类加载器
类加载器:把class文件解析成服务用到的二进制流,通过一个类全限定名来获取此类二进制字节流过程的实现。
obj.getClass() instanceof org.classloading.obj
如果我们自定义加载器加载与当前系统应用程序类加载器加载的做equels,返回false,虽然加载了同一个class文件,但是两个独立的类。
从更大的角度看,jvm虚拟机类加载器,2类,分为1.启动类加载器,2.所有其他类加载器,独立于hotSpot虚拟机排布,都集成java.lang.ClassLoader
从java的jdk角度看,jvm虚拟机类加载器,3类,分为1.启动类加载器,\lib目录类库加载到虚拟机内存中,2.扩展类加载器,\lib\ext目录类库加载到虚拟机内存中,3.应用程序类加载器,用户类路径加载到虚拟机内存中。
24.双亲委派模型
双亲委派模型:类加载器之间的层次关系(启动类加载器->扩展类加载器->应用程序类加载器->自定义加载器)。
工作原理:类加载器收到加载请求,会把请求委派给父类加载器去完成,当父类反馈没有找到所需要的类,子类才去加载。
如果自己重写了Object类,结果是虽然正常编译,但无法被加载运行。
java.lang.ClassLoader的loadClass方法是双亲委派模式的实现。
看loadClass源码也是双亲委派的原理:
先检查是否被加载过,如果已加载返回加载的类,如果没有去父类加载,如果没有找到没有完成加载,再去子类调用本身额的类加载。
1.保证了java程序稳定,不让子类随意修改。
2.如果不适用双亲委派,每次不会到父类加载,每个子类都会自行加载,导致重复多个加载。
双亲委派模型在jdk1.2之后才使用,loadClass在1.0就有了,为了实现向前兼容。有了findClass()保证父类加载失败,再加载自己。
线程上下文加载器:有一种场景父加载器会调回用户代码,不可能给用户代码生成认识这些代码,线程上下文加载器开启long.Thread类的setContextClassLoaser方法做一些自己的事情。
类加载器与OSGi
https://www.cnblogs.com/doit8791/p/5820037.html
分享到:
相关推荐
### 类加载器与双亲委派模型详解 #### 类的生命周期与加载过程 类的生命周期主要包括七个阶段:加载、验证、准备、解析、初始化、使用和卸载。在这七个阶段中,验证、准备和解析统称为连接阶段。类的加载过程主要...
总结来说,类加载器是Java运行时环境的关键组件,它决定了类的生命周期和加载方式,是理解和优化JVM性能、实现动态加载、保障系统安全等方面不可或缺的知识点。深入理解类加载器的工作原理和机制,对于开发高效、...
类加载器的层次结构采用**双亲委派模型**,这意味着当类加载器接收到加载类的请求时,它首先会委托给父类加载器加载,只有当父类加载器无法加载时,当前加载器才会尝试加载。这种设计确保了Java核心库的稳定性,防止...
类加载器按照双亲委派模型工作,即子类加载器优先尝试委托父类加载器加载,只有当父类加载器无法加载时,子类加载器才会尝试自己加载。 2. **链接**: 链接阶段分为验证、准备和解析三个子步骤。 - **验证**:...
Java类的生命周期主要包括以下几个阶段:加载、验证、准备、解析、初始化、使用和卸载。其中,类的初始化时机尤为重要。根据Java规范,以下几种情况必须对类进行初始化: 1. **遇到特定字节码指令**: - 当遇到 `...
Java的类加载器体系采用的是双亲委派模型,这意味着当一个类加载器接收到加载类的请求时,它会首先将任务委托给父类加载器,只有当父类加载器无法找到该类时,子类加载器才会尝试自己加载。 其次,自定义类加载器是...
类加载机制遵循双亲委派模型,即当一个类加载器接收到加载类的请求时,它首先会把这个请求委托给其父类加载器去完成,只有当父类加载器无法加载时,子加载器才会尝试自己加载。这种设计能确保基础类库的一致性,...
类加载机制遵循双亲委派模型,即一个类加载请求会首先交给父加载器处理,只有当父加载器无法加载时,才会由当前加载器尝试。这样设计可以避免类的重复加载,保证核心类的一致性。 3. **类的生命周期** 类的生命...
- Java的类加载机制遵循双亲委派模型,即当一个类加载器接收到加载类的请求时,它首先会将请求委托给父类加载器。只有当父类加载器无法找到对应的类时,子类加载器才会尝试加载。这种设计有助于避免类的重复加载,...
6. **双亲委派模型**:Java的类加载机制遵循双亲委派模型,即子类加载器先尝试将加载请求委托给父类加载器,只有父类加载器无法加载时,子类加载器才会尝试自己加载。这保证了Java的核心库只由引导类加载器加载,...
类加载器在类加载过程中起着关键作用,它们遵循双亲委派模型,从Bootstrap ClassLoader开始,向上委托,直到找到合适的类加载器加载类。开发者还可以自定义类加载器,实现特定的加载逻辑。 总的来说,Java虚拟机的...
Java类加载器分为系统类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和应用程序类加载器(AppClassLoader),它们遵循双亲委派模型。当一个类需要被装载时,加载请求会首先传递给顶级的...
Java的类加载机制采用双亲委派模型,即每个类加载器在尝试加载类时,都会将任务委托给其父类加载器,直到Bootstrap ClassLoader,如果父类加载器无法加载,则子类加载器才会尝试自己加载。我们可以自定义类加载器来...
在Java编程语言中,动态加载和卸载Class是高级特性之一,主要涉及到反射、类加载器和类的生命周期管理。这个小例子将帮助我们理解如何实现动态卸载Class,以及为何在Java中不能直接实现完全的类卸载。 首先,我们要...
类的加载是类生命周期的起始阶段,它包括以下步骤: - **加载**:这是类加载的第一步,JVM会通过类加载器找到.class文件,并将其二进制数据读入内存。这些数据会被存储在方法区,这是一个用于存储已加载类元数据...
Java中的类加载器遵循双亲委派模型,即一个类加载请求会先委托给父类加载器处理,只有当父类加载器无法完成加载时,才会尝试自己去加载。这样设计的目的是为了保证核心类库的安全性和一致性。 在`ClassLoaderTest`...
Java的类加载机制遵循“双亲委派模型”,即当一个类加载器需要加载类时,它会先将请求委托给其父加载器去完成,只有当父加载器无法完成加载时,才会尝试自己加载。这样设计的目的在于保持类的唯一性,防止同一个类被...
而自定义的类通常由应用程序类加载器(Application ClassLoader)加载,它们遵循双亲委派模型,优先使用父加载器尝试加载类,只有当父加载器无法找到对应类时,才会尝试自己加载。 6. **运行时数据区** JVM内存...
类加载器的工作机制遵循“双亲委派模型”,即类加载请求会首先传递给父类加载器处理,如果父类加载器无法处理,则交由子类加载器进行加载。这种机制有助于保护标准库的稳定性和安全性。 ### 完整实例分析 在这个...
在Android中,类加载器(ClassLoader)遵循双亲委派模型,即首先由父加载器尝试加载,如果父加载器无法加载,再由当前加载器尝试。默认情况下,Android使用`PathClassLoader`加载应用的.dex文件。加固过程中,通常...