拉肚子引起的发烧吃什么药| cns医学上是什么意思| 小儿感冒吃什么药| 孽债是什么意思| 骨量减少是什么意思| 中国属于什么气候| 发热出汗是什么原因| 热水器什么牌子好| 当归和党参有什么区别| 中国第一个不平等条约是什么| igm阳性是什么意思| 柳对什么| 孕妇梦见牛是什么意思| 干眼症用什么眼药水| 左脸上长痘痘是什么原因| 中国发明了什么| 保养是什么意思| 来大姨妈喝红糖水有什么作用| 腰扭了挂什么科| 女人梦到被蛇咬是什么意思| 耳朵流血是什么原因| 左耳朵痒代表什么预兆| 狼吞虎咽的意思是什么| 主动脉夹层是什么原因引起的| 乌鸡汤放什么补气补血| 黑舌头的狗是什么狗| 于心不忍是什么意思| 手足口是什么病毒| 宫内积液什么意思| 什么时间吃水果比较好| 心悸吃什么药好| a4纸可以做什么手工| 湿热是什么症状| 5月什么星座| 什么人不能吃鸡蛋| 北京的区长是什么级别| 什么充电宝能带上飞机| 小孩肚子疼吃什么药| 既济是什么意思| 绝对值是什么意思| 大肠杆菌属于什么菌| 吃什么可以提高血小板| 指甲上有竖纹是什么原因| ct和b超有什么区别| 粉红色泡沫样痰是什么病| 急性胃肠炎用什么药| 查贫血挂什么科| 7月26日是什么日子| 电饭煲内胆什么材质好| 芒硝是什么东西| 家人们是什么意思| 不宁腿综合症是什么原因引起的| fsh是什么激素| 吃完海鲜不能吃什么水果| 什么是极差| 婴儿第一次发烧叫什么| 舞蹈症是什么病| 高温丝假发是什么材质| invent是什么意思| 静脉曲张是什么样子| 海藻面膜有什么作用| 小狗感冒症状是什么样的| 吃什么降血压| 6月底什么星座| 什么是马上风| 吃什么油对心脑血管好| 痛风为什么要禁欲| 孙悟空最后成了什么佛| 胃疼可以吃什么药| mpa是什么意思| 慢性非萎缩性胃炎吃什么药效果好| 汪星人什么意思| 飞蚊症是什么原因| 眼底检查主要查什么| 胃萎缩是什么原因| 细水长流是什么意思| sj是什么| 什么书比较好| 电镀是做什么的| 胸部爱出汗是什么原因| 窦卵泡是什么意思| 什么叫托特包| 为什么喝完酒头疼| 微博是什么意思| 7.12是什么星座| 为什么会长腋毛| 胃窦病变意味着什么| 寒凝血瘀吃什么中成药| 间质瘤是什么病| 硕的拼音是什么| 腹直肌是什么| 大便带血是什么原因男| 辅警是什么| 肾与性功能有什么关系| 铁蛋白低是什么意思| 黑色皮肤适合什么颜色的衣服| 太阳指什么生肖| 免贵姓是什么意思| 藜麦是什么东西| 十二月十二日是什么星座| 美国为什么有两块土地| 传说中的狮身人面像叫什么名字| 女性黄体期是什么意思| 口酸吃什么药| 什么是暗网| 东北大拉皮是什么做的| 季字五行属什么| 安全三原则是指什么| 打了狂犬疫苗不能吃什么| 10月出生的是什么星座| 医院总务科是干什么的| 爸爸的姐姐叫什么| 皂角米是什么东西| 农历六月初十是什么日子| 芹菜和什么一起炒好吃| 全程c反应蛋白高说明什么| 脑子里嗡嗡响是什么原因| 指骨属于什么骨| 吃什么止泻| 72年属什么的生肖| 健脾胃吃什么| 头皮发麻什么原因| 午饭吃什么| 什么什么大地| 绿茶是什么茶| 核桃不能和什么一起吃| 尿微量白蛋白高是什么原因| 自在是什么意思| 备孕需要做什么| 睡觉被口水呛醒是什么原因| 碱面是什么| 梦见虫子是什么意思| 盐酸氯米帕明片有什么作用| 23年属什么生肖| 捐肾对身体有什么影响| 菠萝蜜吃多了有什么坏处| 亥和什么合| 血小板减少是什么原因| 大便想拉又拉不出来是什么原因| 血管变窄吃什么能改善| 苹果和生姜煮水喝有什么功效| 铁扇公主是什么妖精| 跑步后尿血是什么情况| 昆明飞机场叫什么名字| 西红柿炒什么好吃| 陶土色大便是什么颜色| 肠炎可以吃什么食物| 看痘痘挂什么科| 亚健康是什么意思| 肠胃不好吃什么药效果好| 唐筛检查什么| 唐僧真名叫什么| 58岁属什么生肖| 1987属什么生肖| cco是什么职位| 吴用属什么生肖| 宝宝消化不良吃什么| 癸是什么意思| 血红蛋白什么意思| 老九门讲的是什么故事| 积劳成疾的疾是什么意思| 随餐服用什么意思| 低压低有什么危害| 人体7大营养素是什么| 类风湿关节炎吃什么药效果好| 什么原因导致卵巢早衰| 亥时右眼跳是什么预兆| 桑叶有什么功效和作用| 尿糖阳性是什么意思| 纷呈是什么意思| 夺目的什么| 低度cin病变是什么意思| 血型阳性是什么意思| 碘伏遇到什么会变白| 手脱皮擦什么药膏| 尿潜血是什么病| 就绪是什么意思| 肠胃不好能吃什么水果| 32周做什么检查| tt是什么意思| 淋巴发炎吃什么药| 香其酱是什么酱| 生日可以送什么礼物| gxg是什么牌子| 拉肚子看什么科| 血糖看什么指标| 胃溃疡吃什么| 什么是情感障碍| 脑子瓦特了什么意思| 什么东西抗衰老最好| 早上起床腰酸痛是什么原因| 荷花什么生肖| 什么茶降糖效果最好| 进贡是什么意思| 女真族现在是什么族| 黄体功能不全是什么意思| 腰椎穿刺是检查什么的| 阑尾炎可以吃什么东西| 梦见玫瑰花是什么预兆| 乐属于五行属什么| 米西米西是什么意思| 豆支念什么| 蚊子怕什么植物| 舅舅和外甥女是什么关系| 生育保险是什么意思| 不放屁是什么原因| 虚火牙痛吃什么药效果最快| 清谷天指的是什么| 唐氏筛查都查些什么| 创客是什么意思| 潘字五行属什么| 海螺什么地方不能吃| 南柯一梦是什么意思| 开除公职是什么意思| 梦见自己得了绝症预示着什么| 812是什么意思| pc什么意思| 嘴唇没有血色是什么原因| 瑶五行属性是什么| 房速与房颤有什么区别| 为什么会有湿气| 血压高有什么症状| 打嗝和嗳气有什么区别| 时柱金舆是什么意思| 气压治疗是什么| 肩周炎是什么原因引起的| 遇上方知有什么意思| 农历六月六日是什么节日| 孩子高烧不退是什么原因| joan什么意思| 隐睾是什么意思| 什么是神话故事| 术后吃什么补元气| nfc果汁是什么意思| 怀孕吃什么药可以流掉| 儿童吃手指是什么原因| 梦见老公不理我是什么意思| 什么是乐高| 乌冬面是什么做的| 胃低分化腺癌是什么意思| 什么清什么秀| 炒木耳为什么会炸锅| gm墨镜是什么牌子| 朱红色是什么颜色| 喝咖啡困倦是什么原因| 轻断食什么意思| emo是什么意思| 脚背痛什么原因| 胎盘成熟度2级是什么意思| ifa是什么意思| 玉越戴越亮是什么原因| 钻石王老五是什么意思| 女性检查甲功是什么病| 发烧应该挂什么科| 喝醉酒是什么感觉| 史铁生为什么瘫痪| 或字多两撇是什么字| 脑神经检查做什么检查| 鲜字五行属什么| 男人有霉菌是什么症状| 香醋和陈醋有什么区别| 14年属什么| 应届是什么意思| 摩什么接什么| 百度Naar inhoud springen

平凉市教师资格不再实行“终身制” 将定期注册

Uit Wikipedia, de vrije encyclopedie
百度 目前“团团”的体重为119公斤,“圆圆”的体重为110公斤。

Een classfile bevat bytecode die uitgevoerd kan worden door een Java Virtual Machine. Classfiles kunnen inmiddels worden geproduceerd door diverse compilers (Javac, JRuby, Scala, Groovy, Kotlin, Clojure, Jython, Fantom, Gosu, en andere), wanneer deze de broncode compileert.

Een classfile bestaat uit de volgende onderdelen:

De header bevat een magic number en versieinformatie. Een magic number is een constante aan het begin van een file die aangeeft dat de file een bepaald soort data bevat. Dit geldt niet alleen voor classfiles, maar ook voor veel andere bestandsformaten, bijvoorbeeld .GIF files en .ZIP files. Het magic number waarmee iedere classfile begint is 0xCAFEBABE.

Het magic number wordt gevolgd door 4 bytes die de versie van de gebruikte specificatie aangeven: eerst 2 bytes voor de minor version, dan 2 bytes voor de major version. Een header voor een classfile met versie 49.0 (J2SE 5.0) ziet er dan als volgt uit:

cafebabe00000031

De header wordt gevolgd door de constantpool. In de constantpool wordt een aantal constanten gedefinieerd die in de rest van de classfile gebruikt worden. De eerste 2 bytes duiden het aantal constanten in de constantpool aan.

Iedere waarde in de pool wordt voorafgegaan door een tag (1 byte) die het datatype aangeeft (en dus ook het aantal bytes dat de daaropvolgende waarde inneemt). Er zijn 11 tags, onder andere voor (UTF-8) strings, integers en verwijzingen naar methoden en fields.

Het begin van een constantpool kan er als volgt uitzien:

 0003           De pool bevat 3 constanten.
 01             De eerste constante is een string.
 0005           De string is 5 bytes.
 48656c6c6f     "Hello".
 

In dit geval bevat de pool 3 constanten (alleen de eerste wordt hier weergegeven). De eerste constante is een UTF-8 string (aangegeven door tag 1[1]). In het geval van een string wordt de tag gevolgd door 2 bytes die de lengte van de string aangeven, in dit geval 5 bytes. Hierna volgt de string zelf: "hello", gecodeerd in hexidecimaal als 48656c6c6f.

Klasse-informatie

[bewerken | brontekst bewerken]

Na de constantpool volgt er informatie over de klasse die door deze bytecodefile gedefinieerd wordt, zoals de naam en de superclass. Dit gedeelte bestaat uit 8 bytes, verdeeld in 4 items van elk 2 bytes:

  • De access flags van de klasse, zoals "public", "abstract" of "final". Deze worden gecodeerd als een bitmask[2].
  • De naam van de klasse. Dit is een verwijzing naar een item in de constantpool dat een string met de naam van de klasse bevat.
  • De superklasse. Dit is weer een verwijzing naar een string in de constantpool.
  • Het aantal interfaces dat deze klasse implementeert.

Als de klasse één of meer interfaces implementeert volgt vervolgens een lijst met de ge?mplementeerde interfaces.

Fields en methods

[bewerken | brontekst bewerken]

Deze sectie beschrijft de velden (fields, of attributen) en methoden van de klasse. De sectie begint met 2 bytes. Deze specificeren het aantal velden van de klasse. Vervolgens volgt de lijst met velden. Daarna komen er weer 2 bytes, die het aantal methoden van deze klasse aangeven. Deze worden op hun beurt weer gevolgd door de methoden.

Velden en methoden worden op dezelfde manier gecodeerd. Elk gedeelte dat een veld of een methode specificeert begint met 2 bytes die de access flags (zoals "static", "public", "abstract", enzovoort) aangeven, gecodeerd als bitmask[3]. De volgende 2 bytes bevatten de naam van de methode of het veld. Dit is weer een verwijzing naar een string in de constantpool.

Type descriptor

[bewerken | brontekst bewerken]

Hierna volgen nog 2 bytes die het type van de methode of het veld specificeren (de zogenaamde type descriptor). Het type van een veld geeft aan welk type waarden het veld kan bevatten. Het type van een methode geeft aan hoeveel argumenten de methode verwacht, van welke datatype deze argumenten zijn en welk datatype de methode retourneert.

Deze uit 2 bytes bestaande type descriptor is weer een verwijzing naar een string in de constantpool. Bijvoorbeeld: de string in de constantpool waarnaar de type-descriptor van de main-routine wijst is altijd ([Ljava/lang/String;)V. Dit geeft aan dat de main-routine een array (aangegeven door [) van strings (aangegeven door Ljava/lang/String) als argument verwacht en void (aangegeven door V) als returntype heeft.

Na de type-descriptor volgen eventuele attributen van de methode of het veld. Een veld kan bijvoorbeeld een ConstValue-attribuut hebben dat de beginwaarde van het veld specificeert. Meestal hebben velden echter geen attributen.

De sectie met attributen begint met 2 bytes die het aantal attributen voor deze methode of dit veld aangeven. Een attribuut wordt als volgt gecodeerd: eerst 2 bytes die weer naar een string in de constantpool verwijzen. Deze string bevat de naam van het attribuut. Vervolgens 4 bytes die de lengte van de data die bij het attribuut hoort aangeven.

De classfile specificatie maakt het mogelijk om zelf nieuwe attributen toe te voegen. De JVM die de classfile uitvoert negeert attributen die hij niet ondersteunt.

Het code-attribuut

[bewerken | brontekst bewerken]

Methoden hebben in meestal in ieder geval één attribuut: een Code-attribuut. Hierin wordt onder andere gespecificeert hoeveel items op de stack de methode (maximaal) gebruikt, en hoeveel lokale variabelen. Ook wordt in het Code-attribuut de implementatie van de methode (de body) opgenomen.

Na de body van de methode volgt nog informatie over de exceptions die de methode afhandeld[4]. En ten slotte kan het Code-attribuut op zijn beurt ook nog weer attributen hebben. Die worden dan na de informatie over exceptions gespecificeerd.

Voorbeeld van een Code-attribuut

[bewerken | brontekst bewerken]

Het Code-attribuut van een methode kan er als volgt uitzien:

 0003       De naam van dit attribuut is de derde string in de constantpool (in dit geval "Code").
 00000009   De data van dit attribuut is 9 bytes groot.
 0002       Deze methode gebruikt 2 items op de stack.
 0000       Deze methode gebruikt geen lokale variabelen.
 00000001   De lengte van de code zelf (de implementatie van de methode) is 1 byte.
 b1         De body van de methode bestaat hier uit slechts 1 instructie, met opcode 5.

De bovenstaande methode bevat slechts één instructie: een return-statement (deze heeft opcode 5).

Class attributen

[bewerken | brontekst bewerken]

De classfile eindigt met (nog) een lijst attributen. Deze gelden voor de hele class en worden op dezelfde manier gecodeerd als de attributen van velden en methodes. Ook hier geeft de specificatie de mogelijkheid om nieuwe attributen te implementeren. De specificatie zelf definieerd alleen het SourceFile-attribuut, die de naam van de file met broncode bevat waarvan de classfile afkomstig is (voor debuggers).

Opcodes en instructies

[bewerken | brontekst bewerken]

Zoals we al zagen worden de instructies waaruit een methode bestaat opgeslagen in een Code-attribuut bij de betreffende methode. Omdat o.a. Java geen code buiten methodes (behalve declaraties en initialisatie-assignments) toestaat kunnen alle instructies waaruit een programma bestaat op deze manier in de classfile opgeslagen worden.

Broncode-statements en expressies worden hiervoor door de compiler vertaald naar reeksen zogenaamde bytecodes. Net als bij "echte" machinetaal bestaat een bytecode-instructie uit een opcode en een aantal argumenten, de operanden, waarbij het aantal operanden en hun lengte afhangt van de opcode.

Een serie bytecode-instructies kan er als volgt uitzien:

 1201      Opcode 18:  Push item op de stack. Argument: de integer 1.
 1202                  Zelfde, maar push nu een 2 op de stack.
 60        Opcode 96:  Haal 2 items van de stack, tel ze op en zet het resultaat op de stack
 3601      Opcode 54:  Haal item van de stack en sla deze op in lokale variabele 1.
 b20508    Opcode 178: Haal een verwijzing naar een statisch veld uit de constantpool, 
                       in dit geval "java.lang.System.out".
 1501      Opcode 21:  Push inhoud van een lokale variabele op de stack.
 b60609    Opcode 182: Haal een verwijzing naar een object en een argument van de stack. 
                       Roep vervolgens de methode op index 0609 in de constantpool aan op 
                       het object met het argument van de stack als argument.

Het bovenstaande voorbeeld wordt aanschouwelijker als we het noteren als Java assembler:

 ldc 1                                                 # 1 naar stack
 ldc 2                                                 # 2 naar stack
 iadd                                                  # optellen, resultaat naar stack
 istore 1                                              # resultaat opslaan in lokale variabele
 getstatic java/lang/System/out Ljava/io/PrintStream;  # ref naar System.out (type PrintStream)
                                                       # op de stack
 iload 1                                               # inhoud lokale variabele naar stack
 invokevirtual java/io/PrintStream/println(I)V         # System.out.println(1)
                                                       # System.out en 1 komen van de stack 

Dit stukje bytecode telt 1 en 2 bij elkaar op en print het resultaat.

6月18是什么星座 怀孕为什么会流褐色分泌物 出血热是什么病 养什么鱼招财转运 外甥和舅舅是什么关系
一什么月牙 13岁属什么生肖 开场白是什么意思 段子是什么意思 他达拉非片是什么药
六月二十一是什么日子 学生近视配什么镜片好 第57个民族是什么民族 突然吐血是什么原因 朝鲜韩国什么时候分开的
什么是水象星座 蹂躏是什么意思 爱豆是什么 口大是什么字 破壁机是干什么用的
blush是什么颜色hcv8jop5ns1r.cn 免疫系统由什么组成hcv8jop8ns0r.cn 广东省省长什么级别hcv8jop5ns7r.cn 氤氲是什么意思hcv9jop4ns3r.cn 朋友圈发女朋友照片配什么文字hcv8jop0ns7r.cn
肾虚吃什么补最好hcv8jop4ns9r.cn 椰青是什么hcv7jop6ns1r.cn 什么是肾癌hcv8jop3ns5r.cn 头出汗多是什么原因hcv8jop4ns4r.cn 肚子特别疼是什么原因hcv7jop9ns8r.cn
色觉异常是什么意思hcv8jop2ns7r.cn 三长两短是什么意思hcv8jop2ns3r.cn 失眠有什么办法解决hcv8jop0ns0r.cn 尿很臭是什么原因hcv9jop2ns1r.cn 备孕前准备吃什么叶酸hcv9jop6ns8r.cn
肾气不足吃什么中药xjhesheng.com 念珠菌是什么病hcv8jop1ns9r.cn 休止期脱发什么意思hcv8jop1ns0r.cn 脾胃气虚吃什么中成药hcv8jop9ns3r.cn 糖类抗原125是什么指标hcv9jop1ns1r.cn
百度