当前位置: 首页 > 编程日记 > 正文

java 中 bean 的生命周期

java 中 bean 的生命周期

本篇中会对涉及到的知识点皆做出描述:

首先,我们先了解先虚拟机的类加载机制:

虚拟机把描述类的数据从Class 文件中加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的 java 类型,这便是虚拟机的类加载机制。

也就是说,一个文本.java 文件要运行起来:它首先要经过编译成为 Class 文件(字节码文件),然后被虚拟机加载读入内存,接着虚拟机首先对其中的数据进行校验

一个类从被加载的虚拟机内存中开始到卸载出内存为止(java 类的卸载并不能人为主动卸载,只能通过 JVM 的垃圾回收来卸载。没有像 C 中析构函数那样的东西)经历的有:

加载

加载阶段虚拟机完成三件事情:

1.通过一个类的全限定名称来获取定义此类的二进制字节流

2.将这个字节流所代表的静态储存结构转化为方法区的运行时数据结构。

3.在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口

验证

验证阶段大致完成4个阶段的检验动作:

1.文件格式验证

该验证阶段时基于二进制字节流的,通过这个阶段验证后字节流才会进入内存的方法区中进行存储。而后面的3个验证阶段全部是基于方法区的存储结构进行的。

2.元数据验证:比如校验类的继承关系是否合法

3.字节码验证:例如保证跳转指令不会跳转到方法体之外的字节码指令上。

4.符号引用验证:例如符号引用中通过字符串描述的全限定名称是否能找到对应的类

准备

正式为类变量分配内存并设置类变量初始值,变量所使用的内存都将在方法区中进行分配。(这个时候进行内存分配的仅包括类变量既被 static 修饰的变量而不包括实例变量。实例变量会在对象实例话时随着对象一起分配在 java 堆中

这时分配的初始值往往都时零值,实际代码中定义的值在初始化阶段才会赋予。(final修饰的除外,会在此阶段赋值

解析

解析阶段是将常量池内的符号引用替换为直接引用的过程。

1.类或接口的解析

比如当前所在A类,在A类中引用了B类且B类从未被解析过。

(1)如果B不是一个数组类型,那虚拟机会把代表B的全限定名传递给A类的加载器去加载类B。

(2)如果B是一个数组类型,并且数组的元素为对象。那么虚拟机会按(1)中的方式去加载数组的元素类型。接着虚拟机会生成一个代表此数组维度和元素的数组对象。

(3)如果上面的步骤没有异常,那么B在虚拟机中实际上已经成为一个有效的类或接口了,但在解析完成之前还需进行符号引用验证,确认A是否具备对B的访问权限。如不具备则抛出java.lang.IllegalAccessError 非法访问异常。

2.字段解析

(1)如果A类本身包含了简单名称和字段描述符都与目标相匹配的字段,则返回这个字段的直接引用,查找结束。

(2)否则,如果在A中实现了接口,将会按照继承关系从下往上递归搜索各个接口的它的的父接口,如果接口中包含了简单名称和字段描述符都与目标相匹配的字段,则返回这个字段的直接引用,查找结束。

(3)否则,如果A不是java.lang.Object的话,将会按照继承关系从下往上递归搜索其父类。如果在父类中包含了简单名称和字段描述符都与目标相匹配的字段,则返回字段查找结束。

(4)否则,查找失败。

如果查找成功了还会对该字段进行权限验证,如发现不具备对字段的访问权限,将抛出java.lang.IllegalAccessError异常。

3.类方法解析

4.接口方法解析

初始化

进行初始化的条件:

1.当遇到 new\getstatic\putstatic\或invokestatic这4调字节码指令时,如没有进行过初始化则需要出发初始化。

           既 当你用 new 实例化一个对象时  读取或者设置一个类的静态字段时 (这里有一种静态字段除外:用 final 修饰,既已在编译期把结果放入常量池的静态字段除外)   调用一个类的静态方法的时候 (同样,也是被 fianl 修饰的除外)

          总结来说,第一点就是 当用 new 实例化一个对象时 以及 用到没有被 final 修饰的类的静态字段或方法时 就会触发初始化

2.使用 反射包的方法对类进行反射调用的时候

           这个更好理解,反射调用类的方法是需要类的实例的,得到类的实例便要经过初始化过程。

3.当初始化一个类时,如果发现其父类还未初始化,则要先触发其父类的初始化(接口稍有区别,只有在真正使用到父类接口的时候才会去初始化)

4.当虚拟机启动时会先初始化主类(既包含main() 方法的那个类)

5.当使用JDK1.7的动态语言支持时。如果 java.lang.incoke.MethodHandle 实例最后的解析结果 REF_getStatic、REF_putStatic、REF_invokeStatic 的方法句柄,并且这个方法句柄所对应的类没有进行过初始化,则需要先触发其初始化。

(了解java.lang.incoke.MethodHandle)

有且只有这五种情况才会触发初始化。这五种为主动引用。除此之外所有引用类的方式都不会触发初始化,这些称为被动引动。

一下为被动引用:

1.通过子类引用父类的静态字段。

2.通过数组定义来引用类,不会触发此类的初始化

3.常量在编译阶段存入调用类的常量池中,本质上并没有直接引用到定义常量的类,所以不会触发定义常量的类的初始化。

卸载

这七个阶段。其中,验证、准备、解析三个部分又被称为连接。

这几个阶段的顺序:

首先 加载、验证、准备、初始化和卸载这五个过程是确定的(使用不用多说)。

1.加载------>2.验证------>3.准备------->............?初始化.........6.使用------->.7.卸载

解析和初始化这两个的顺序是不确定的。某些情况下解析可以在初始化之后再开始,以支持java 的运行时绑定,既动态绑定。(而动态绑定最为容易想到的例子就是多态)所以,可以说java 多态也是因为解析步骤可以在初始化之后。

而确定的这五个过程也并不是等一个完成才进行下一个的,这些阶段通常都是互相交叉混合的进行的,通常会在一个阶段执行的过程中调用、激活另一个阶段。

posted on 2018-03-21 21:23 code前行 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/codefeng/p/8598050.html

相关文章:

python简易版实例_Python3之简单搭建自带服务器的实例讲解

WEB开发,我们先从搭建一个简单的服务器开始,Python自带服务模块,且python3相比于python2有很大不同, 在Python2.6版本里,/usr/bin/lib/python2.6/ 目录下会有 BaseHTTPServer.py, SimpleHTTPServer.py, CGIHTTPServer.…

如何选择分布式系统(区块链)协议?

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 如何选择分布式系统(区块链)协议? 在构建包分布式系统功能的应用程序时,《财富》500强企业和创始人经常问我们…

MySQL与IO

数据库作为存储系统,所有业务访问数据的操作都会转化为底层数据库系统的IO行为(缓存系统也可以当做是key-value的数据库),本文主要介绍访问mysql数据库的IO流程以及IO相关的参数。 一 MySQL 的文件 首先简单介绍一下MySQL的数据文件,MySQL 数据库包含如下…

python括号配对问题_使用Python的栈实现括号匹配算法

写一个栈的类:stack.py class Stack: def __init__(self): self.items [] def is_Empty(self): return self.items [] def push(self, item): self.items.append(item) def pop(self): return self.items.pop() def peek(self): return self.items[len(items)-1] …

万航单位换算器 V1.0 绿色版

软件名称: 万航单位换算器软件语言: 简体中文授权方式: 免费软件运行环境: Win 32位/64位软件大小: 347KB图片预览: 软件简介:万航单位换算器是一个可以随意转换单位的绿色软件,这个软件收集了各…

Golang学习-基础命令

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 、 Golang学习-基础命令 一、go run 用于运行命令源码文件,只能接收一个命令源码文件以及若干个库源码文件作为参数。先将源码文件编译…

js MD5加密处理

关于MD5: MD5.js是通过前台js加密的方式对用户信息,密码等私密信息进行加密处理的工具,也可称为插件。 在本案例中 可以看到MD5共有6种加密方法: 1, hex_md5(value) 2, b64_md5(value) 3, st…

手机qq2008触屏版_比微信老却是00后最爱 手机QQ 16年进化史

5月5日,腾讯QQ发布了《00后数据报告》,第一次以长图形式向公众展示了00后对于QQ的喜爱。当然物是人非,当年那个“胖企鹅”已经和现在功能强大、颜值超高的QQ不可同日而语。那些留存在我们记忆中,给我们带来无尽欢乐的聊天工具&…

密码学是如何保护区块链的

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 密码学是如何保护区块链的 摘要:密码学是应用数学函数以保证数据安全性的科学。 许多风靡的影视作品都在向人们暗示:只要有…

洛谷.4234.最小差值生成树(LCT)

题目链接 先将边排序,这样就可以按从小到大的顺序维护生成树,枚举到一条未连通的边就连上,已连通则(用当前更大的)替换掉路径上最小的边,这样一定不会更差。 每次构成树时更新答案。答案就是当前边减去生成树上最小边的权值。 LCT…

python数字计算公式_Python中数字以及算数运算符的相关使用

Python数字 数字数据类型用于存储数值。 他们是不可改变的数据类型,这意味着改变数字数据类型会分配一个新的对象。 当你指定一个值时,Number对象就会被创建: var1 1 var2 10 您也可以使用del语句删除一些对象引用。 del语句的语法是&#…

软件测试安全测试高峰论坛

Nubia测试以及介绍 基于Cucumber的自动化测试平台 常见Web漏洞之XSS,主要HTML与JS基础、XSS的基础知识与挖掘方法、XSS的利用 自动化测试框架以及测试思路 转载于:https://www.cnblogs.com/ITniu/p/5776005.html

以太坊是什么,为什么这么火?

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 以太坊是什么 以太坊(Ethereum)是一个建立在区块链技术之上, 去中心化应用平台。它允许任何人在平台中建立和使…

Python 把字符串变成浮点数

from functools import reducedi {}di.update(zip(1234567890., [1,2,3,4,5,6,7,8,9,0,.])) def str2float(s): st s.split(.) st1 reduce(lambda x,y: 10*x y, map(lambda x: di[x], st[0])) try: st2 reduce(lambda x,y: (x*0.1 y), map(lambda x:…

msbuild FileSysExcludeFiles

<?xml version"1.0" encoding"utf-8"?> <!-- This file is used by the publish/package process of your Web project. You can customize the behavior of this process by editing this MSBuild file. In order to learn more about this pl…

python二分法求解_Python使用二分法求平方根的简单示例

这篇文章主要为大家详细介绍了Python使用二分法求平方根的简单示例&#xff0c;具有一定的参考价值&#xff0c;可以用来参考一下。 对python这个高级语言感兴趣的小伙伴&#xff0c;下面一起跟随512笔记的小编两巴掌来看看吧&#xff01; 使用二分法&#xff08;Bisection Met…

智能合约语言Solidity Solidity API

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 智能合约语言Solidity Solidity API Solidity 是以太坊智能合约编程语言&#xff0c;阅读本文前&#xff0c;你应该对以太坊、智能合约有所了解&am…

PHP PSR-4 Autoloader 自动加载(中文版)

引用&#xff1a;https://segmentfault.com/a/1190000002521658 Autoloader 关键词 “必须”("MUST")、“一定不可/一定不能”("MUST NOT")、“需要”("REQUIRED")、“将会”("SHALL")、“不会”("SHALL NOT")、“应该”(&q…

236. Lowest Common Ancestor of a Binary Tree

原题链接&#xff1a;https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree/description/ 代码实现如下&#xff1a; import java.util.LinkedList; import java.util.Queue; import java.util.Stack;/*** Created by clearbug on 2018/2/26.*/ public clas…

python中append的用法_Python 列表 append() 使用方法及示例

Python 列表 append() 使用方法及示例 append()方法将一个项目添加到列表的末尾。 append()方法将单个项目添加到列表的末尾。 append()方法的语法为&#xff1a;list.append(item) append()参数 该方法有一个参数item -要添加到列表末尾的项目 该项目可以是数字&#xff0c;字…

Web3与智能合约交互实战

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 Web3与智能合约交互实战 以太坊中智能合约和web3交互实战 最近区块链、以太坊十分的火&#xff0c;所有就会有许多人去进入区块链这个工作&#x…

BZOJ 4595 SHOI2015 激光发生器 射线,线段,偏转

题目链接&#xff1a;http://www.lydsy.com/JudgeOnline/problem.php?id4595 题意概述&#xff1a; 给出一条射线和N条线段&#xff0c;射线遇到线段会发生反射&#xff0c;令入射角alpha&#xff0c;出射角beta&#xff0c;则betaalpha*phi_i&#xff08;即对于每条线段phi是…

实现一个 能在O(1)时间复杂度 完成 Push、Pop、Min操作的 栈

一&#xff0c;问题描述 实现一个栈&#xff08;元素遵守先入后出顺序&#xff09;&#xff0c;能够通过 min 方法在 O(1)时间内获取栈中的最小元素。同时&#xff0c;栈的基本操作&#xff1a;入栈(Push)、出栈(Pop)&#xff0c;也是在O(1)时间内完成的。 二&#xff0c;问题分…

华为js面试题_四面腾讯与华为,大厂前端面试真BT!

今年算是经历颇多的一年了&#xff0c;腾讯和华为都走了几趟&#xff08;一共面试了四个部门&#xff09;&#xff0c;拿了两个offer。&#xff08;开心.png&#xff09;&#xff0c;但还是挂了两次&#xff0c;有点遗憾。面试题总结面试完之后&#xff0c;赶紧总结了一波&…

你和区块链的距离就差这篇文章!

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 近年来&#xff0c;“区块链”逐渐成为热门话题&#xff0c;2018年各种关于区块链的行业资讯、投融资创业、技术和应用探索等集中爆发&#xff0c;…

Browser Security-超文本标记语言(HTML)

重要的4个规则&#xff1a; 1 &符号不应该出现在HTML的大部分节点中。 2 尖括号<>是不应该出现在标签内的&#xff0c;除非为引号引用。 3 在text节点里面&#xff0c;<左尖括号有很大的危害。 4 引号在标签内可能有危害&#xff0c;具体危害取决于存在的位置&…

NestedScrolling CoordinatorLayout

Android NestedScrolling机制完全解析 带你玩转嵌套滑动 一步一步深入理解CoordinatorLayout 源码看CoordinatorLayout.Behavior原理 转载于:https://www.cnblogs.com/cornellbox/p/8649891.html

python下载电脑版本不对_初学Python,因为某些原因电脑只能装3.1版本,现遇到这个小问题求解答...

#!/usr/bin/env python # -*- coding: utf-8 -*-任务: 假设用户输入的英文名字不规范&#xff0c;没有按照首字母大写&#xff0c;后续字母小写的规则&#xff0c; 请利用map()函数&#xff0c;把一个list&#xff08;包含若干不规范的英文名字&#xff09;变成一个包含规范英文…

以太坊是什么?

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 以太坊是一个全新开放的区块链平台&#xff0c;它允许任何人在平台中建立和使用通过区块链技术运行的去中心化应用。就像比特币一样&#xff0c;以…

前端相关html和css

#请参考http://www.cnblogs.com/pycode/p/5792142.html #html css 和js说明 ##1.什么是html&#xff1f; HTML(HyperText MarkUp Language)超文本标记语言,通过使用标记来描述文档结构和表现形式的一种语言,由浏览器进行解析,然后把结果显示在网页上&#xff0c;通俗的讲它就是…