导航:首页 > 编程语言 > javaobjectboolean

javaobjectboolean

发布时间:2024-06-12 19:49:02

❶ 什么是 java 虚拟机

您好,提问者:

Java虚拟机简称JVM,它的作用如下:

1、其实Java不可跨平台,真正实现跨平台的是JVM虚拟机。

2、JVM其实就是一个编译java、运行class的一个跟操作系统的一个软件。

3、JVM的作用只针对于Java,而系统中的东西与它无关。

4、其实说白了就是一个软件,就像VMware一样。

Java虚拟机


一、什么是Java虚拟机


Java虚拟机是一个想象中的机器,在实际的计算机上通过软件模拟来实现。Java虚拟机有自己想象中的硬件,如处理器、堆栈、寄存器等,还具有相应的指令系统。


  1. 为什么要使用Java虚拟机

Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用模式Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。


2.谁需要了解Java虚拟机


Java虚拟机是Java语言底层实现的基础,对Java语言感兴趣的人都应对Java虚拟机有个大概的了解。这有助于理解Java语言的一些性质,也有助于使用Java语言。对于要在特定平台上实现Java虚拟机的软件人员,Java语言的编译器作者以及要用硬件芯片实现Java虚拟机的人来说,则必须深刻理解Java虚拟机的规范。另外,如果你想扩展Java语言,或是把其它语言编译成Java语言的字节码,你也需要深入地了解Java虚拟机。


3.Java虚拟机支持的数据类型


Java虚拟机支持Java语言的基本数据类型如下:


byte://1字节有符号整数的补码

short://2字节有符号整数的补码

int://4字节有符号整数的补码

long://8字节有符号整数的补码

float://4字节IEEE754单精度浮点数

double://8字节IEEE754双精度浮点数

char://2字节无符号Unicode字符


几乎所有的Java类型检查都是在编译时完成的。上面列出的原始数据类型的数据在Java执行时不需要用硬件标记。操作这些原始数据类型数据的字节码(指令)本身就已经指出了操作数的数据类型,例如iadd、ladd、fadd和dadd指令都是把两个数相加,其操作数类型别是int、long、float和double。虚拟机没有给boolean(布尔)类型设置单独的指令。boolean型的数据是由integer指令,包括integer返回来处理的。boolean型的数组则是用byte数组来处理的。虚拟机使用IEEE754格式的浮点数。不支持IEEE格式的较旧的计算机,在运行Java数值计算程序时,可能会非常慢。


虚拟机支持的其它数据类型包括:

object//对一个Javaobject(对象)的4字节引用

returnAddress//4字节,用于jsr/ret/jsr-w/ret-w指令

注:Java数组被当作object处理。


虚拟机的规范对于object内部的结构没有任何特殊的要求。在Sun公司的实现中,对object的引用是一个句柄,其中包含一对指针:一个指针指向该object的方法表,另一个指向该object的数据。用Java虚拟机的字节码表示的程序应该遵守类型规定。Java虚拟机的实现应拒绝执行违反了类型规定的字节码程序。Java虚拟机由于字节码定义的限制似乎只能运行于32位地址空间的机器上。但是可以创建一个Java虚拟机,它自动地把字节码转换成64位的形式。从Java虚拟机支持的数据类型可以看出,Java对数据类型的内部格式进行了严格规定,这样使得各种Java虚拟机的实现对数据的解释是相同的,从而保证了Java的与平台无关性和可

移植性。


二、Java虚拟机体系结构


Java虚拟机由五个部分组成:一组指令集、一组寄存器、一个栈、一个无用单元收集堆(Garbage-collected-heap)、一个方法区域。这五部分是Java虚拟机的逻辑成份,不依赖任何实现技术或组织方式,但它们的功能必须在真实机器上以某种方式实现。


  1. Java指令集

Java虚拟机支持大约248个字节码。每个字节码执行一种基本的CPU运算,例如,把一个整数加到寄存器,子程序转移等。Java指令集相当于Java程序的汇编语言。

Java指令集中的指令包含一个单字节的操作符,用于指定要执行的操作,还有0个或多个操作数,提供操作所需的参数或数据。许多指令没有操作数,仅由一个单字节的操作符构成。


虚拟机的内层循环的执行过程如下:


do{

取一个操作符字节;

根据操作符的值执行一个动作;

}while(程序未结束)


由于指令系统的简单性,使得虚拟机执行的过程十分简单,从而有利于提高执行的效率。指令中操作数的数量和大小是由操作符决定的。如果操作数比一个字节大,那么它存储的顺序是高位字节优先。例如,一个16位的参数存放时占用两个字节,其值为:


第一个字节*256+第二个字节字节码指令流一般只是字节对齐的。指令tabltch和lookup是例外,在这两条指令内部要求强制的4字节边界对齐。


2.寄存器


Java虚拟机的寄存器用于保存机器的运行状态,与微处理器中的某些专用寄存器类似。


Java虚拟机的寄存器有四种:

pc:Java程序计数器。

optop:指向操作数栈顶端的指针。

frame:指向当前执行方法的执行环境的指针。

vars:指向当前执行方法的局部变量区第一个变量的指针。


Java虚拟机


Java虚拟机是栈式的,它不定义或使用寄存器来传递或接受参数,其目的是为了保证指令集的简洁性和实现时的高效性(特别是对于寄存器数目不多的处理器)。

所有寄存器都是32位的。


3.栈


Java虚拟机的栈有三个区域:局部变量区、运行环境区、操作数区。


(1)局部变量区 每个Java方法使用一个固定大小的局部变量集。它们按照与vars寄存器的字偏移量来寻址。局部变量都是32位的。长整数和双精度浮点数占据了两个局部变量的空间,却按照第一个局部变量的索引来寻址。(例如,一个具有索引n的局部变量,如果是一个双精度浮点数,那么它实际占据了索引n和n+1所代表的存储空间。)虚拟机规范并不要求在局部变量中的64位的值是64位对齐的。虚拟机提供了把局部变量中的值装载到操作数栈的指令,也提供了把操作数栈中的值写入局部变量的指令。


(2)运行环境区 在运行环境中包含的信息用于动态链接,正常的方法返回以及异常传播。


·动态链接

运行环境包括对指向当前类和当前方法的解释器符号表的指针,用于支持方法代码的动态链接。方法的class文件代码在引用要调用的方法和要访问的变量时使用符号。动态链接把符号形式的方法调用翻译成实际方法调用,装载必要的类以解释还没有定义的符号,并把变量访问翻译成与这些变量运行时的存储结构相应的偏移地址。动态链接方法和变量使得方法中使用的其它类的变化不会影响到本程序的代码。


·正常的方法返回

如果当前方法正常地结束了,在执行了一条具有正确类型的返回指令时,调用的方法会得到一个返回值。执行环境在正常返回的情况下用于恢复调用者的寄存器,并把调用者的程序计数器增加一个恰当的数值,以跳过已执行过的方法调用指令,然后在调用者的执行环境中继续执行下去。


·异常和错误传播

异常情况在Java中被称作Error(错误)或Exception(异常),是Throwable类的子类,在程序中的原因是:①动态链接错,如无法找到所需的class文件。②运行时错,如对一个空指针的引用


·程序使用了throw语句。

当异常发生时,Java虚拟机采取如下措施:

·检查与当前方法相联系的catch子句表。每个catch子句包含其有效指令范围,能够处理的异常类型,以及处理异常的代码块地址。

·与异常相匹配的catch子句应该符合下面的条件:造成异常的指令在其指令范围之内,发生的异常类型是其能处理的异常类型的子类型。如果找到了匹配的catch子句,那么系统转移到指定的异常处理块处执行;如果没有找到异常处理块,重复寻找匹配的catch子句的过程,直到当前方法的所有嵌套的catch子句都被检查过。

·由于虚拟机从第一个匹配的catch子句处继续执行,所以catch子句表中的顺序是很重要的。因为Java代码是结构化的,因此总可以把某个方法的所有的异常处理器都按序排列到一个表中,对任意可能的程序计数器的值,都可以用线性的顺序找到合适的异常处理块,以处理在该程序计数器值下发生的异常情况。

·如果找不到匹配的catch子句,那么当前方法得到一个"未截获异常"的结果并返回到当前方法的调用者,好像异常刚刚在其调用者中发生一样。如果在调用者中仍然没有找到相应的异常处理块,那么这种错误传播将被继续下去。如果错误被传播到最顶层,那么系统将调用一个缺省的异常处理块。

(3)操作数栈区 机器指令只从操作数栈中取操作数,对它们进行操作,并把结果返回到栈中。选择栈结构的原因是:在只有少量寄存器或非通用寄存器的机器(如Intel486)上,也能够高效地模拟虚拟机的行为。操作数栈是32位的。它用于给方法传递参数,并从方法接收结果,也用于支持操作的参数,并保存操作的结果。例如,iadd指令将两个整数相加。相加的两个整数应该是操作数栈顶的两个字。这两个字是由先前的指令压进堆栈的。这两个整数将从堆栈弹出、相加,并把结果压回到操作数栈中。


每个原始数据类型都有专门的指令对它们进行必须的操作。每个操作数在栈中需要一个存储位置,除了long和double型,它们需要两个位置。操作数只能被适用于其类型的操作符所操作。例如,压入两个int类型的数,如果把它们当作是一个long类型的数则是非法的。在Sun的虚拟机实现中,这个限制由字节码验证器强制实行。但是,有少数操作(操作符pe和swap),用于对运行时数据区进行操作时是不考虑类型的。


4.无用单元收集堆


Java的堆是一个运行时数据区,类的实例(对象)从中分配空间。Java语言具有无用单元收集能力:它不给程序员显式释放对象的能力。Java不规定具体使用的无用单元收集算法,可以根据系统的需求使用各种各样的算法。


5.方法区


方法区与传统语言中的编译后代码或是Unix进程中的正文段类似。它保存方法代码(编译后的java代码)和符号表。在当前的Java实现中,方法代码不包括在无用单元收集堆中,但计划在将来的版本中实现。每个类文件包含了一个Java类或一个Java界面的编译后的代码。可以说类文件是Java语言的执行代码文件。为了保证类文件的平台无关性,Java虚拟机规范中对类文件的格式也作了详细的说明。其具体细节请参考Sun公司的Java虚拟机规范。

❷ 浠涔埚彨铏氭嫙链猴纻

浠涔堟槸铏氭嫙链猴纻

铏氭嫙链虹殑姒傚康姣旇缉瀹芥硾锛岄氩父浜轰滑鎺ヨЕ鍒扮殑铏氭嫙链烘傚康链塚Mware闾f牱镄勭‖浠舵ā𨰾熻蒋浠讹纴涔熸湁JVM杩欐牱镄勪粙浜庣‖浠跺拰缂栬疟绋嫔簭涔嬮棿镄勮蒋浠躲傝繖閲屾墍鎸囩殑鏄钖庤呫
铏氭嫙链烘槸涓涓鎶借薄镄勮$畻链猴纴鍜屽疄闄呯殑璁$畻链轰竴镙凤纴鍏锋湁涓涓鎸囦护闆嗗苟浣跨敤涓嶅悓镄勫瓨鍌ㄥ尯锘熴傚畠璐熻矗镓ц屾寚浠わ纴杩樿佺$悊鏁版嵁銆佸唴瀛桦拰瀵勫瓨鍣ㄣ傝繖鍙拌櫄𨰾熺殑链哄櫒鍦ㄤ换浣曞钩鍙颁笂閮芥彁渚涚粰缂栬疟绋嫔簭涓涓镄勫叡钖岀殑鎺ュ彛銆傜紪璇戠▼搴忓彧闇瑕侀溃钖戣櫄𨰾熸満锛岀敓鎴愯櫄𨰾熸満鑳藉熺悊瑙g殑浠g爜锛岀劧钖庣敱瑙i喷鍣ㄦ潵灏呜櫄𨰾熸満浠g爜杞鎹涓虹壒瀹氱郴缁熺殑链哄櫒镰佹墽琛屻

Java铏氭嫙链

涓銆佷粈涔堟槸Java铏氭嫙链

Java铏氭嫙链烘槸涓涓𨱍宠薄涓镄勬満鍣,鍦ㄥ疄闄呯殑璁$畻链轰笂阃氲繃杞浠舵ā𨰾熸潵瀹炵幇銆侸ava铏氭嫙链烘湁镊宸辨兂璞′腑镄勭‖浠,濡傚勭悊鍣ㄣ佸爢镙堛佸瘎瀛桦櫒绛,杩桦叿链夌浉搴旂殑鎸囦护绯荤粺銆

1.涓轰粈涔堣佷娇鐢↗ava铏氭嫙链

Java璇瑷镄勪竴涓闱炲父閲嶈佺殑鐗圭偣灏辨槸涓庡钩鍙扮殑镞犲叧镐с傝屼娇鐢↗ava铏氭嫙链烘槸瀹炵幇杩欎竴鐗圭偣镄勫叧阌銆备竴鑸镄勯珮绾ц瑷濡傛灉瑕佸湪涓嶅悓镄勫钩鍙颁笂杩愯,镊冲皯闇瑕佺紪璇戞垚涓嶅悓镄勭洰镙囦唬镰併傝屽紩鍏Java璇瑷铏氭嫙链哄悗,Java璇瑷鍦ㄤ笉钖屽钩鍙颁笂杩愯屾椂涓嶉渶瑕侀吨鏂扮紪璇戙侸ava璇瑷浣跨敤妯″纺Java铏氭嫙链哄睆钄戒简涓庡叿浣揿钩鍙扮浉鍏崇殑淇℃伅,浣垮缑Java璇瑷缂栬疟绋嫔簭鍙闇鐢熸垚鍦↗ava铏氭嫙链轰笂杩愯岀殑鐩镙囦唬镰(瀛楄妭镰),灏卞彲浠ュ湪澶氱嶅钩鍙颁笂涓嶅姞淇鏀瑰湴杩愯屻侸ava铏氭嫙链哄湪镓ц屽瓧鑺傜爜镞,鎶婂瓧鑺傜爜瑙i喷鎴愬叿浣揿钩鍙颁笂镄勬満鍣ㄦ寚浠ゆ墽琛屻

2.璋侀渶瑕佷简瑙Java铏氭嫙链

Java铏氭嫙链烘槸Java璇瑷搴曞眰瀹炵幇镄勫熀纭,瀵笿ava璇瑷镒熷叴瓒g殑浜洪兘搴斿笿ava铏氭嫙链烘湁涓澶ф傜殑浜呜В銆傝繖链夊姪浜庣悊瑙Java璇瑷镄勪竴浜涙ц川,涔熸湁锷╀簬浣跨敤Java璇瑷銆傚逛簬瑕佸湪鐗瑰畾骞冲彴涓婂疄鐜癑ava铏氭嫙链虹殑杞浠朵汉锻,Java璇瑷镄勭紪璇戝櫒浣滆呬互鍙婅佺敤纭浠惰姱鐗囧疄鐜癑ava铏氭嫙链虹殑浜烘潵璇,鍒椤繀椤绘繁鍒荤悊瑙Java铏氭嫙链虹殑瑙勮寖銆傚彟澶,濡傛灉浣犳兂镓╁𪾢Java璇瑷,鎴栨槸鎶婂叾瀹冭瑷缂栬疟鎴怞ava璇瑷镄勫瓧鑺傜爜,浣犱篃闇瑕佹繁鍏ュ湴浜呜ВJava铏氭嫙链恒

3.Java铏氭嫙链烘敮鎸佺殑鏁版嵁绫诲瀷

Java铏氭嫙链烘敮鎸丣ava璇瑷镄勫熀链鏁版嵁绫诲瀷濡备笅:

byte://1瀛楄妭链夌﹀彿鏁存暟镄勮ˉ镰
short://2瀛楄妭链夌﹀彿鏁存暟镄勮ˉ镰
int://4瀛楄妭链夌﹀彿鏁存暟镄勮ˉ镰
long://8瀛楄妭链夌﹀彿鏁存暟镄勮ˉ镰
float://4瀛楄妭IEEE754鍗旷簿搴︽诞镣规暟
double://8瀛楄妭IEEE754鍙岀簿搴︽诞镣规暟
char://2瀛楄妭镞犵﹀彿Unicode瀛楃

鍑犱箮镓链夌殑Java绫诲瀷妫镆ラ兘鏄鍦ㄧ紪璇戞椂瀹屾垚镄勚备笂闱㈠垪鍑虹殑铡熷嬫暟鎹绫诲瀷镄勬暟鎹鍦↗ava镓ц屾椂涓嶉渶瑕佺敤纭浠舵爣璁般傛搷浣滆繖浜涘师濮嬫暟鎹绫诲瀷鏁版嵁镄勫瓧鑺傜爜(鎸囦护)链韬灏卞凡缁忔寚鍑轰简镎崭綔鏁扮殑鏁版嵁绫诲瀷,渚嫔俰add銆乴add銆乫add鍜宒add鎸囦护閮芥槸鎶娄袱涓鏁扮浉锷,鍏舵搷浣沧暟绫诲瀷鍒鏄痠nt銆乴ong銆乫loat鍜宒ouble銆傝櫄𨰾熸満娌℃湁缁檅oolean(甯冨皵)绫诲瀷璁剧疆鍗旷嫭镄勬寚浠ゃ侠oolean鍨嬬殑鏁版嵁鏄鐢眎nteger鎸囦护,鍖呮嫭integer杩斿洖𨱒ュ勭悊镄勚侠oolean鍨嬬殑鏁扮粍鍒欐槸鐢╞yte鏁扮粍𨱒ュ勭悊镄勚傝櫄𨰾熸満浣跨敤IEEE754镙煎纺镄勬诞镣规暟銆备笉鏀鎸両EEE镙煎纺镄勮缉镞х殑璁$畻链,鍦ㄨ繍琛孞ava鏁板艰$畻绋嫔簭镞,鍙鑳戒细闱炲父鎱銆

铏氭嫙链烘敮鎸佺殑鍏跺畠鏁版嵁绫诲瀷鍖呮嫭:
object//瀵逛竴涓狫avaobject(瀵硅薄)镄4瀛楄妭寮旷敤
returnAddress//4瀛楄妭,鐢ㄤ簬jsr/ret/jsr-w/ret-w鎸囦护
娉:Java鏁扮粍琚褰扑綔object澶勭悊銆

铏氭嫙链虹殑瑙勮寖瀵逛簬object鍐呴儴镄勭粨鏋勬病链変换浣旷壒娈婄殑瑕佹眰銆傚湪Sun鍏鍙哥殑瀹炵幇涓,瀵筼bject镄勫紩鐢ㄦ槸涓涓鍙ユ焺,鍏朵腑鍖呭惈涓瀵规寚阍:涓涓鎸囬拡鎸囧悜璇object镄勬柟娉曡〃,鍙︿竴涓鎸囧悜璇object镄勬暟鎹銆傜敤Java铏氭嫙链虹殑瀛楄妭镰佽〃绀虹殑绋嫔簭搴旇ラ伒瀹堢被鍨嬭勫畾銆侸ava铏氭嫙链虹殑瀹炵幇搴旀嫆缁濇墽琛岃缭鍙崭简绫诲瀷瑙勫畾镄勫瓧鑺傜爜绋嫔簭銆侸ava铏氭嫙链虹敱浜庡瓧鑺傜爜瀹氢箟镄勯檺鍒朵技涔庡彧鑳借繍琛屼簬32浣嶅湴鍧绌洪棿镄勬満鍣ㄤ笂銆备絾鏄鍙浠ュ垱寤轰竴涓狫ava铏氭嫙链,瀹冭嚜锷ㄥ湴鎶婂瓧鑺傜爜杞鎹㈡垚64浣岖殑褰㈠纺銆备粠Java铏氭嫙链烘敮鎸佺殑鏁版嵁绫诲瀷鍙浠ョ湅鍑,Java瀵规暟鎹绫诲瀷镄勫唴閮ㄦ牸寮忚繘琛屼简涓ユ牸瑙勫畾,杩欐牱浣垮缑钖勭岼ava铏氭嫙链虹殑瀹炵幇瀵规暟鎹镄勮В閲婃槸鐩稿悓镄,浠庤屼缭璇佷简Java镄勪笌骞冲彴镞犲叧镐у拰鍙
绉绘嶆с

浜屻丣ava铏氭嫙链轰綋绯荤粨鏋

Java铏氭嫙链虹敱浜斾釜閮ㄥ垎缁勬垚:涓缁勬寚浠ら泦銆佷竴缁勫瘎瀛桦櫒銆佷竴涓镙堛佷竴涓镞犵敤鍗曞厓鏀堕泦鍫(Garbage-collected-heap)銆佷竴涓鏂规硶鍖哄烟銆傝繖浜旈儴鍒嗘槸Java铏氭嫙链虹殑阃昏緫鎴愪唤,涓崭緷璧栦换浣曞疄鐜版妧链鎴栫粍缁囨柟寮,浣嗗畠浠镄勫姛鑳藉繀椤诲湪鐪熷疄链哄櫒涓娄互镆愮嶆柟寮忓疄鐜般

1.Java鎸囦护闆

Java铏氭嫙链烘敮鎸佸ぇ绾248涓瀛楄妭镰併傛疮涓瀛楄妭镰佹墽琛屼竴绉嶅熀链镄凛PU杩愮畻,渚嫔,鎶娄竴涓鏁存暟锷犲埌瀵勫瓨鍣,瀛愮▼搴忚浆绉荤瓑銆侸ava鎸囦护闆嗙浉褰扑簬Java绋嫔簭镄勬眹缂栬瑷銆
Java鎸囦护闆嗕腑镄勬寚浠ゅ寘钖涓涓鍗曞瓧鑺傜殑镎崭綔绗,鐢ㄤ簬鎸囧畾瑕佹墽琛岀殑镎崭綔,杩樻湁0涓鎴栧氢釜镎崭綔鏁,鎻愪緵镎崭綔镓闇镄勫弬鏁版垨鏁版嵁銆傝稿氭寚浠ゆ病链夋搷浣沧暟,浠呯敱涓涓鍗曞瓧鑺傜殑镎崭綔绗︽瀯鎴愩

铏氭嫙链虹殑鍐呭眰寰鐜镄勬墽琛岃繃绋嫔备笅:

do{
鍙栦竴涓镎崭綔绗﹀瓧鑺;
镙规嵁镎崭綔绗︾殑鍊兼墽琛屼竴涓锷ㄤ綔;
}while(绋嫔簭链缁撴潫)

鐢变簬鎸囦护绯荤粺镄勭亩鍗曟,浣垮缑铏氭嫙链烘墽琛岀殑杩囩▼鍗佸垎绠鍗,浠庤屾湁鍒╀簬鎻愰珮镓ц岀殑鏁堢巼銆傛寚浠や腑镎崭綔鏁扮殑鏁伴噺鍜屽ぇ灏忔槸鐢辨搷浣灭﹀喅瀹氱殑銆傚傛灉镎崭綔鏁版瘆涓涓瀛楄妭澶,闾d箞瀹冨瓨鍌ㄧ殑椤哄簭鏄楂树綅瀛楄妭浼桦厛銆备緥濡,涓涓16浣岖殑鍙傛暟瀛樻斁镞跺崰鐢ㄤ袱涓瀛楄妭,鍏跺间负:

绗涓涓瀛楄妭*256+绗浜屼釜瀛楄妭瀛楄妭镰佹寚浠ゆ祦涓鑸鍙鏄瀛楄妭瀵归绨镄勚傛寚浠tabltch鍜宭ookup鏄渚嫔,鍦ㄨ繖涓ゆ浔鎸囦护鍐呴儴瑕佹眰寮哄埗镄4瀛楄妭杈圭晫瀵归绨銆

2.瀵勫瓨鍣

Java铏氭嫙链虹殑瀵勫瓨鍣ㄧ敤浜庝缭瀛樻満鍣ㄧ殑杩愯岀姸镐,涓庡井澶勭悊鍣ㄤ腑镄勬煇浜涗笓鐢ㄥ瘎瀛桦櫒绫讳技銆

Java铏氭嫙链虹殑瀵勫瓨鍣ㄦ湁锲涚:
pc:Java绋嫔簭璁℃暟鍣ㄣ
optop:鎸囧悜镎崭綔鏁版爤椤剁镄勬寚阍堛
frame:鎸囧悜褰揿墠镓ц屾柟娉旷殑镓ц岀幆澧幂殑鎸囬拡銆
vars:鎸囧悜褰揿墠镓ц屾柟娉旷殑灞閮ㄥ彉閲忓尯绗涓涓鍙橀噺镄勬寚阍堛

Java铏氭嫙链

Java铏氭嫙链烘槸镙埚纺镄,瀹冧笉瀹氢箟鎴栦娇鐢ㄥ瘎瀛桦櫒𨱒ヤ紶阃掓垨鎺ュ弹鍙傛暟,鍏剁洰镄勬槸涓轰简淇濊瘉鎸囦护闆嗙殑绠娲佹у拰瀹炵幇镞剁殑楂樻晥镐(鐗瑰埆鏄瀵逛簬瀵勫瓨鍣ㄦ暟鐩涓嶅氱殑澶勭悊鍣)銆
镓链夊瘎瀛桦櫒閮芥槸32浣岖殑銆

3.镙

Java铏氭嫙链虹殑镙堟湁涓変釜鍖哄烟:灞閮ㄥ彉閲忓尯銆佽繍琛岀幆澧冨尯銆佹搷浣沧暟鍖恒

(1)灞閮ㄥ彉閲忓尯 姣忎釜Java鏂规硶浣跨敤涓涓锲哄畾澶у皬镄勫眬閮ㄥ彉閲忛泦銆傚畠浠鎸夌収涓巚ars瀵勫瓨鍣ㄧ殑瀛楀亸绉婚噺𨱒ュ诲潃銆傚眬閮ㄥ彉閲忛兘鏄32浣岖殑銆傞暱鏁存暟鍜屽弻绮惧害娴镣规暟鍗犳嵁浜嗕袱涓灞閮ㄥ彉閲忕殑绌洪棿,鍗存寜镦х涓涓灞閮ㄥ彉閲忕殑绱㈠紩𨱒ュ诲潃銆(渚嫔,涓涓鍏锋湁绱㈠紩n镄勫眬閮ㄥ彉閲,濡傛灉鏄涓涓鍙岀簿搴︽诞镣规暟,闾d箞瀹冨疄闄呭崰鎹浜嗙储寮昻鍜宯+1镓浠h〃镄勫瓨鍌ㄧ┖闂淬)铏氭嫙链鸿勮寖骞朵笉瑕佹眰鍦ㄥ眬閮ㄥ彉閲忎腑镄64浣岖殑鍊兼槸64浣嶅归绨镄勚傝櫄𨰾熸満鎻愪緵浜嗘妸灞閮ㄥ彉閲忎腑镄勫艰呰浇鍒版搷浣沧暟镙堢殑鎸囦护,涔熸彁渚涗简鎶婃搷浣沧暟镙堜腑镄勫煎啓鍏ュ眬閮ㄥ彉閲忕殑鎸囦护銆

(2)杩愯岀幆澧冨尯 鍦ㄨ繍琛岀幆澧冧腑鍖呭惈镄勪俊鎭鐢ㄤ簬锷ㄦ侀摼鎺,姝e父镄勬柟娉曡繑锲炰互鍙婂纾甯镐紶鎾銆

路锷ㄦ侀摼鎺
杩愯岀幆澧冨寘𨰾瀵规寚钖戝綋鍓岖被鍜屽綋鍓嶆柟娉旷殑瑙i喷鍣ㄧ﹀彿琛ㄧ殑鎸囬拡,鐢ㄤ簬鏀鎸佹柟娉曚唬镰佺殑锷ㄦ侀摼鎺ャ傛柟娉旷殑class鏂囦欢浠g爜鍦ㄥ紩鐢ㄨ佽皟鐢ㄧ殑鏂规硶鍜岃佽块梾镄勫彉閲忔椂浣跨敤绗﹀彿銆傚姩镐侀摼鎺ユ妸绗﹀彿褰㈠纺镄勬柟娉曡皟鐢ㄧ炕璇戞垚瀹为檯鏂规硶璋幂敤,瑁呰浇蹇呰佺殑绫讳互瑙i喷杩樻病链夊畾涔夌殑绗﹀彿,骞舵妸鍙橀噺璁块梾缈昏疟鎴愪笌杩欎簺鍙橀噺杩愯屾椂镄勫瓨鍌ㄧ粨鏋勭浉搴旂殑锅忕Щ鍦板潃銆傚姩镐侀摼鎺ユ柟娉曞拰鍙橀噺浣垮缑鏂规硶涓浣跨敤镄勫叾瀹幂被镄勫彉鍖栦笉浼氩奖鍝嶅埌链绋嫔簭镄勪唬镰併

路姝e父镄勬柟娉曡繑锲
濡傛灉褰揿墠鏂规硶姝e父鍦扮粨𨱒熶简,鍦ㄦ墽琛屼简涓𨱒″叿链夋g‘绫诲瀷镄勮繑锲炴寚浠ゆ椂,璋幂敤镄勬柟娉曚细寰楀埌涓涓杩斿洖鍊笺傛墽琛岀幆澧冨湪姝e父杩斿洖镄勬儏鍐典笅鐢ㄤ簬鎭㈠嶈皟鐢ㄨ呯殑瀵勫瓨鍣,骞舵妸璋幂敤钥呯殑绋嫔簭璁℃暟鍣ㄥ炲姞涓涓鎭板綋镄勬暟鍊,浠ヨ烦杩囧凡镓ц岃繃镄勬柟娉曡皟鐢ㄦ寚浠,铹跺悗鍦ㄨ皟鐢ㄨ呯殑镓ц岀幆澧冧腑缁х画镓ц屼笅铡汇

路寮傚父鍜岄敊璇浼犳挱
寮傚父𨱍呭喌鍦↗ava涓琚绉颁綔Error(阌栾)鎴朎xception(寮傚父),鏄疶hrowable绫荤殑瀛愮被,鍦ㄧ▼搴忎腑镄勫师锲犳槸:鈶犲姩镐侀摼鎺ラ敊,濡傛棤娉曟垒鍒版墍闇镄刢lass鏂囦欢銆傗憽杩愯屾椂阌,濡傚逛竴涓绌烘寚阍堢殑寮旷敤

路绋嫔簭浣跨敤浜唗hrow璇鍙ャ
褰揿纾甯稿彂鐢熸椂,Java铏氭嫙链洪噰鍙栧备笅鎺鏂:
路妫镆ヤ笌褰揿墠鏂规硶鐩歌仈绯荤殑catch瀛愬彞琛ㄣ傛疮涓猚atch瀛愬彞鍖呭惈鍏舵湁鏁堟寚浠よ寖锲,鑳藉熷勭悊镄勫纾甯哥被鍨,浠ュ强澶勭悊寮傚父镄勪唬镰佸潡鍦板潃銆
路涓庡纾甯哥浉鍖归厤镄刢atch瀛愬彞搴旇ョ﹀悎涓嬮溃镄勬浔浠:阃犳垚寮傚父镄勬寚浠ゅ湪鍏舵寚浠よ寖锲翠箣鍐,鍙戠敓镄勫纾甯哥被鍨嬫槸鍏惰兘澶勭悊镄勫纾甯哥被鍨嬬殑瀛愮被鍨嬨傚傛灉镓惧埌浜嗗尮閰岖殑catch瀛愬彞,闾d箞绯荤粺杞绉诲埌鎸囧畾镄勫纾甯稿勭悊鍧楀勬墽琛;濡傛灉娌℃湁镓惧埌寮傚父澶勭悊鍧,閲嶅嶅绘垒鍖归厤镄刢atch瀛愬彞镄勮繃绋,鐩村埌褰揿墠鏂规硶镄勬墍链夊祵濂楃殑catch瀛愬彞閮借妫镆ヨ繃銆
路鐢变簬铏氭嫙链轰粠绗涓涓鍖归厤镄刢atch瀛愬彞澶勭户缁镓ц,镓浠catch瀛愬彞琛ㄤ腑镄勯‘搴忔槸寰堥吨瑕佺殑銆傚洜涓筼ava浠g爜鏄缁撴瀯鍖栫殑,锲犳ゆ诲彲浠ユ妸镆愪釜鏂规硶镄勬墍链夌殑寮傚父澶勭悊鍣ㄩ兘鎸夊簭鎺掑垪鍒颁竴涓琛ㄤ腑,瀵逛换镒忓彲鑳界殑绋嫔簭璁℃暟鍣ㄧ殑鍊,閮藉彲浠ョ敤绾挎х殑椤哄簭镓惧埌钖堥傜殑寮傚父澶勭悊鍧,浠ュ勭悊鍦ㄨョ▼搴忚℃暟鍣ㄥ间笅鍙戠敓镄勫纾甯告儏鍐点
路濡傛灉镓句笉鍒板尮閰岖殑catch瀛愬彞,闾d箞褰揿墠鏂规硶寰楀埌涓涓"链鎴銮峰纾甯"镄勭粨鏋滃苟杩斿洖鍒板綋鍓嶆柟娉旷殑璋幂敤钥,濂藉儚寮傚父鍒氩垰鍦ㄥ叾璋幂敤钥呬腑鍙戠敓涓镙枫傚傛灉鍦ㄨ皟鐢ㄨ呬腑浠岖劧娌℃湁镓惧埌鐩稿簲镄勫纾甯稿勭悊鍧,闾d箞杩欑嶉敊璇浼犳挱灏呜缁х画涓嫔幓銆傚傛灉阌栾琚浼犳挱鍒版渶椤跺眰,闾d箞绯荤粺灏呜皟鐢ㄤ竴涓缂虹渷镄勫纾甯稿勭悊鍧椼
(3)镎崭綔鏁版爤鍖 链哄櫒鎸囦护鍙浠庢搷浣沧暟镙堜腑鍙栨搷浣沧暟,瀵瑰畠浠杩涜屾搷浣,骞舵妸缁撴灉杩斿洖鍒版爤涓銆傞夋嫨镙堢粨鏋勭殑铡熷洜鏄:鍦ㄥ彧链夊皯閲忓瘎瀛桦櫒鎴栭潪阃氱敤瀵勫瓨鍣ㄧ殑链哄櫒(濡侷ntel486)涓,涔熻兘澶熼珮鏁埚湴妯℃嫙铏氭嫙链虹殑琛屼负銆傛搷浣沧暟镙堟槸32浣岖殑銆傚畠鐢ㄤ簬缁欐柟娉曚紶阃掑弬鏁,骞朵粠鏂规硶鎺ユ敹缁撴灉,涔熺敤浜庢敮鎸佹搷浣灭殑鍙傛暟,骞朵缭瀛樻搷浣灭殑缁撴灉銆备緥濡,iadd鎸囦护灏嗕袱涓鏁存暟鐩稿姞銆傜浉锷犵殑涓や釜鏁存暟搴旇ユ槸镎崭綔鏁版爤椤剁殑涓や釜瀛椼傝繖涓や釜瀛楁槸鐢卞厛鍓岖殑鎸囦护铡嬭繘鍫嗘爤镄勚傝繖涓や釜鏁存暟灏嗕粠鍫嗘爤寮瑰嚭銆佺浉锷,骞舵妸缁撴灉铡嫔洖鍒版搷浣沧暟镙堜腑銆

姣忎釜铡熷嬫暟鎹绫诲瀷閮芥湁涓挞棬镄勬寚浠ゅ瑰畠浠杩涜屽繀椤荤殑镎崭綔銆傛疮涓镎崭綔鏁板湪镙堜腑闇瑕佷竴涓瀛桦偍浣岖疆,闄や简long鍜宒ouble鍨,瀹冧滑闇瑕佷袱涓浣岖疆銆傛搷浣沧暟鍙鑳借阃傜敤浜庡叾绫诲瀷镄勬搷浣灭︽墍镎崭綔銆备緥濡,铡嫔叆涓や釜int绫诲瀷镄勬暟,濡傛灉鎶婂畠浠褰扑綔鏄涓涓猯ong绫诲瀷镄勬暟鍒欐槸闱炴硶镄勚傚湪Sun镄勮櫄𨰾熸満瀹炵幇涓,杩欎釜闄愬埗鐢卞瓧鑺傜爜楠岃瘉鍣ㄥ己鍒跺疄琛屻备絾鏄,链夊皯鏁版搷浣(镎崭綔绗pe鍜宻wap),鐢ㄤ簬瀵硅繍琛屾椂鏁版嵁鍖鸿繘琛屾搷浣沧椂鏄涓嶈冭槛绫诲瀷镄勚

4.镞犵敤鍗曞厓鏀堕泦鍫

Java镄勫爢鏄涓涓杩愯屾椂鏁版嵁鍖,绫荤殑瀹炰緥(瀵硅薄)浠庝腑鍒嗛厤绌洪棿銆侸ava璇瑷鍏锋湁镞犵敤鍗曞厓鏀堕泦鑳藉姏:瀹冧笉缁欑▼搴忓憳鏄惧纺閲婃斁瀵硅薄镄勮兘锷涖侸ava涓嶈勫畾鍏蜂綋浣跨敤镄勬棤鐢ㄥ崟鍏冩敹闆嗙畻娉,鍙浠ユ牴鎹绯荤粺镄勯渶姹备娇鐢ㄥ悇绉嶅悇镙风殑绠楁硶銆

5.鏂规硶鍖

鏂规硶鍖轰笌浼犵粺璇瑷涓镄勭紪璇戝悗浠g爜鎴栨槸Unix杩涚▼涓镄勬f枃娈电被浼笺傚畠淇濆瓨鏂规硶浠g爜(缂栬疟钖庣殑java浠g爜)鍜岀﹀彿琛ㄣ傚湪褰揿墠镄凧ava瀹炵幇涓,鏂规硶浠g爜涓嶅寘𨰾鍦ㄦ棤鐢ㄥ崟鍏冩敹闆嗗爢涓,浣呜″垝鍦ㄥ皢𨱒ョ殑鐗堟湰涓瀹炵幇銆傛疮涓绫绘枃浠跺寘钖浜嗕竴涓狫ava绫绘垨涓涓狫ava鐣岄溃镄勭紪璇戝悗镄勪唬镰併傚彲浠ヨ寸被鏂囦欢鏄疛ava璇瑷镄勬墽琛屼唬镰佹枃浠躲备负浜嗕缭璇佺被鏂囦欢镄勫钩鍙版棤鍏虫,Java铏氭嫙链鸿勮寖涓瀵圭被鏂囦欢镄勬牸寮忎篃浣滀简璇︾粏镄勮存槑銆傚叾鍏蜂綋缁呜妭璇峰弬钥侨un鍏鍙哥殑Java铏氭嫙链鸿勮寖銆

❸ 如何用maven将java8写的代码编译为java6平台的

在一般的Java应用开发过程中,开发人员使用Java的方式比较简单。打开惯用的IDE,编写Java源代码,再利用IDE提供的功能直接运行Java 程序就可以了。这种开发模式背后的过程是:开发人员编写的是Java源代码文件(.java),IDE会负责调用Java的编译器把Java源代码编译成平台无关的字节代码(byte code),以类文件的形式保存在磁盘上(.class)。Java虚拟机(JVM)会负责把Java字节代码加载并执行。Java通过这种方式来实现其“编写一次,到处运行(Write once, run anywhere)” 的目标。Java类文件中包含的字节代码可以被不同平台上的JVM所使用。Java字节代码不仅可以以文件形式存在于磁盘上,也可以通过网络方式来下载,还可以只存在于内存中。JVM中的类加载器会负责从包含字节代码的字节数组(byte[])中定义出Java类。在某些情况下,可能会需要动态的生成 Java字节代码,或是对已有的Java字节代码进行修改。这个时候就需要用到本文中将要介绍的相关技术。首先介绍一下如何动态编译Java源文件。
动态编译Java源文件
在一般情况下,开发人员都是在程序运行之前就编写完成了全部的Java源代码并且成功编译。对有些应用来说,Java源代码的内容在运行时刻才能确定。这个时候就需要动态编译源代码来生成Java字节代码,再由JVM来加载执行。典型的场景是很多算法竞赛的在线评测系统(如PKU JudgeOnline),允许用户上传Java代码,由系统在后台编译、运行并进行判定。在动态编译Java源文件时,使用的做法是直接在程序中调用Java编译器。
JSR 199引入了Java编译器API。如果使用JDK 6的话,可以通过此API来动态编译Java代码。比如下面的代码用来动态编译最简单的Hello World类。该Java类的代码是保存在一个字符串中的。
01 public class CompilerTest {
02 public static void main(String[] args) throws Exception {
03 String source = "public class Main { public static void main(String[] args) {System.out.println(\"Hello World!\");} }";
04 JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
05 StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
06 StringSourceJavaObject sourceObject = newCompilerTest.StringSourceJavaObject("Main", source);
07 Iterable< extends JavaFileObject> fileObjects = Arrays.asList(sourceObject);
08 CompilationTask task = compiler.getTask(null, fileManager, null,null, null, fileObjects);
09 boolean result = task.call();
10 if (result) {
11 System.out.println("编译成功。");
12 }
13 }
14
15 static class StringSourceJavaObject extends SimpleJavaFileObject {
16
17 private String content = null;
18 public StringSourceJavaObject(String name, String content) ??throwsURISyntaxException {
19 super(URI.create("string:///" + name.replace('.','/') + Kind.SOURCE.extension), Kind.SOURCE);
20 this.content = content;
21 }
22
23 public CharSequence getCharContent(boolean ignoreEncodingErrors) ??throws IOException {
24 return content;
25 }
26 }
27 }
如果不能使用JDK 6提供的Java编译器API的话,可以使用JDK中的工具类com.sun.tools.javac.Main,不过该工具类只能编译存放在磁盘上的文件,类似于直接使用javac命令
另外一个可用的工具是Eclipse JDT Core提供的编译器。这是Eclipse Java开发环境使用的增量式Java编译器,支持运行和调试有错误的代码。该编译器也可以单独使用。Play框架在内部使用了JDT的编译器来动态编译Java源代码。在开发模式下,Play框架会定期扫描项目中的Java源代码文件,一旦发现有修改,会自动编译 Java源代码。因此在修改代码之后,刷新页面就可以看到变化。使用这些动态编译的方式的时候,需要确保JDK中的tools.jar在应用的 CLASSPATH中。
下面介绍一个例子,是关于如何在Java里面做四则运算,比如求出来(3+4)*7-10的值。一般的做法是分析输入的运算表达式,自己来模拟计算过程。考虑到括号的存在和运算符的优先级等问题,这样的计算过程会比较复杂,而且容易出错。另外一种做法是可以用JSR 223引入的脚本语言支持,直接把输入的表达式当做JavaScript或是JavaFX脚本来执行,得到结果。下面的代码使用的做法是动态生成Java源代码并编译,接着加载Java类来执行并获取结果。这种做法完全使用Java来实现。
01 private static double calculate(String expr) throws CalculationException {
02 String className = "CalculatorMain";
03 String methodName = "calculate";
04 String source = "public class " + className
05 + " { public static double " + methodName + "() { return " + expr +"; } }";
06 //省略动态编译Java源代码的相关代码,参见上一节
07 boolean result = task.call();
08 if (result) {
09 ClassLoader loader = Calculator.class.getClassLoader();
10 try {
11 Class<?> clazz = loader.loadClass(className);
12 Method method = clazz.getMethod(methodName, new Class<?>[] {});
13 Object value = method.invoke(null, new Object[] {});
14 return (Double) value;
15 } catch (Exception e) {
16 throw new CalculationException("内部错误。");
17 }
18 } else {
19 throw new CalculationException("错误的表达式。");
20 }
21 }
上面的代码给出了使用动态生成的Java字节代码的基本模式,即通过类加载器来加载字节代码,创建Java类的对象的实例,再通过Java反射API来调用对象中的方法。
Java字节代码增强
Java 字节代码增强指的是在Java字节代码生成之后,对其进行修改,增强其功能。这种做法相当于对应用程序的二进制文件进行修改。在很多Java框架中都可以见到这种实现方式。Java字节代码增强通常与Java源文件中的注解(annotation)一块使用。注解在Java源代码中声明了需要增强的行为及相关的元数据,由框架在运行时刻完成对字节代码的增强。Java字节代码增强应用的场景比较多,一般都集中在减少冗余代码和对开发人员屏蔽底层的实现细节上。用过JavaBeans的人可能对其中那些必须添加的getter/setter方法感到很繁琐,并且难以维护。而通过字节代码增强,开发人员只需要声明Bean中的属性即可,getter/setter方法可以通过修改字节代码来自动添加。用过JPA的人,在调试程序的时候,会发现实体类中被添加了一些额外的 域和方法。这些域和方法是在运行时刻由JPA的实现动态添加的。字节代码增强在面向方面编程(AOP)的一些实现中也有使用。

❹ 求解 java动态编译找不到类,往各位大虾指导

参照网上其他童鞋的例子与介绍,修改了一下:
import java.io.IOException;
import java.lang.reflect.Method;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Arrays;

import javax.tools.JavaCompiler;
import javax.tools.JavaCompiler.CompilationTask;
import javax.tools.JavaFileObject;
import javax.tools.SimpleJavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;

/**
* 动态编译Java 源文件
*
* @author shenshouer
*
*/
public class CompilerTest {

public static void main(String[] args) throws Exception {
String source = "public class Main { " + "public static void main(String[]args) {"
+ "System.out.println(\"Hello World!\");" + "} " + "}";

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
StringSourceJavaObject sourceObject = new CompilerTest.StringSourceJavaObject("Main",
source);
Iterable<? extends JavaFileObject> fileObjects = Arrays.asList(sourceObject);

// 获取编译类根路径,不然会报找不到类的错误
String path = Class.class.getClass().getResource("/").getPath();
Iterable< String> options = Arrays.asList("-d", path);

// 增加options参数
// CompilationTask task = compiler.getTask(null, fileManager, null, null, null, fileObjects);
CompilationTask task = compiler.getTask(null, fileManager, null, options, null, fileObjects);

boolean result = task.call();

if (result) {
System.out.println("编译成功。");

ClassLoader loader = CompilerTest.class.getClassLoader();
try {
Class<?> clazz = loader.loadClass("Main");
Method method = clazz.getMethod("main", String[].class);
// 修改调用参数,不然会报参数个数不对
// Object value = method.invoke(null, new Object[] {});
Object value = method.invoke(null, new Object[] {new String[]{}});
System.out.println(value);
} catch (Exception e) {
e.printStackTrace();
}
}
}

static class StringSourceJavaObject extends SimpleJavaFileObject {

private String content = null;

public StringSourceJavaObject(String name, String content) throws URISyntaxException {
super(URI.create("string:///" + name.replace('.', '/') + Kind.SOURCE.extension),
Kind.SOURCE);
this.content = content;
}

public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {
return content;
}
}
}

❺ java中,负责对字节代码解释执行的是

java中负责对字节代码解释执行的是虚拟机,虚拟机将得到的字节代码进行编码运行。
java程序,是先把java源程序通过javac命令编译成字节码文件,然后再用java命令解释执行。把字节码文件复制到其它计算机上,只要有java虚拟机就可以用java命令来执行。

阅读全文

与javaobjectboolean相关的资料

热点内容
测量员app如何用坐标换算距离 浏览:527
运算符和库函数编译器处理的区别 浏览:487
宜昌程序员招聘 浏览:327
专业的电商程序源码服务商 浏览:140
家用云服务器如何注册 浏览:622
电脑文件夹打开变小了 浏览:514
程序员都特别在算法上有研究 浏览:362
爱疯app资源库如何不显示在主屏幕 浏览:984
服务器失联是为什么 浏览:842
风控算程序员 浏览:630
加密狗远程修改 浏览:723
我的世界网易服务器的地址是什么 浏览:924
地谷轮压缩机与艾默生 浏览:268
太力真空压缩袋好吗 浏览:915
中老年程序员写代码 浏览:16
加密货币白皮书怎么写 浏览:475
中文版的pdf 浏览:107
else在python的用法 浏览:549
if命令cmd 浏览:688
花书pdf 浏览:272