成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Thinking in Java學(xué)習(xí)筆記——Type Information

liangzai_cool / 2971人閱讀

摘要:找到字節(jié)碼并創(chuàng)建一個(gè)對(duì)象。鏈接,檢驗(yàn)字節(jié)碼,為字段分配存儲(chǔ)空間,解決其對(duì)他類的引用。初始化,如果有父類則初始化父類,執(zhí)行靜態(tài)初始化器和靜態(tài)初始化區(qū)塊直到第一次訪問(wèn)靜態(tài)成員時(shí)初始化才執(zhí)行。如果成員不是編譯時(shí)常量由初始化器賦值,也會(huì)引起初始化。

有兩種形式在運(yùn)行時(shí)獲取類型信息:

傳統(tǒng)的RTTI

反射

Class對(duì)象

運(yùn)行時(shí)的類型信息是通過(guò)Class對(duì)象表現(xiàn)的,它包含了類的信息。所有“普通的”對(duì)象都是通過(guò)Class對(duì)象創(chuàng)建的。Java通過(guò)Class對(duì)象實(shí)現(xiàn)RTTI。

在你的程序中每個(gè)類都對(duì)應(yīng)一個(gè)Class對(duì)象。每次編寫并編譯一個(gè)新的類時(shí)都會(huì)創(chuàng)建一個(gè)相應(yīng)的Class對(duì)象,并且以.class文件儲(chǔ)存起來(lái)。JVM用class loader子系統(tǒng)創(chuàng)建對(duì)象。

JVM有一個(gè)原生的class loader用來(lái)加載“可信類”,包括JAVA API中的類。你也可以實(shí)現(xiàn)自己的帶有特殊目的的class loader并與原生的串聯(lián)起來(lái)。

在一個(gè)類第一次被訪問(wèn)static成員時(shí),這個(gè)類則被加載到JVM。構(gòu)造函數(shù)也是靜態(tài)的,所以用new創(chuàng)建對(duì)象時(shí)也算訪問(wèn)了static成員。因此Java程序運(yùn)行前并不是完全加載了。

class loader先檢查類型的Class對(duì)象是否加載了,如果沒加載,class loader會(huì)找到.class文件(其他的class loader可能會(huì)從別處加載二進(jìn)制碼,比如從數(shù)據(jù)庫(kù))。字節(jié)被加載之后會(huì)被驗(yàn)證一下有沒有損壞或者有沒有不安全的代碼。

Class對(duì)象被加載到內(nèi)存之后,將被用來(lái)創(chuàng)建這個(gè)類型的所有對(duì)象。

所有Class對(duì)象都屬于Class類,和其他類一樣可以使用引用操作Class對(duì)象。一種獲得Class對(duì)象的方法是調(diào)用靜態(tài)的forName()方法,這個(gè)方法接收一個(gè)字符串類型,是類的名字,需要使用包括報(bào)名的全名。如果找不到.class文件,會(huì)拋出一個(gè)ClassNotFoundException。

在運(yùn)行時(shí),使用類型信息之前要先獲取Class對(duì)象。Class.forName()是比較方便的做法。如果已經(jīng)有一個(gè)這個(gè)類型的對(duì)象了,可以調(diào)用對(duì)象getClass()方法,這個(gè)方法是在Object里定義的。

Class literals

除了forName()外,Java還提供一種獲得Class對(duì)象引用的方法,比如Toy.class。這種方法更簡(jiǎn)潔和更安全,因?yàn)檫@種方法的類型在編譯時(shí)就會(huì)被檢查。

基本類型的包裝類有一個(gè)標(biāo)準(zhǔn)字段TYPE,提供了基本類型的Class對(duì)象,例如:boolean.class <=> Boolean.TYPE。

__使用.class獲得Class對(duì)象引用不會(huì)初始化Class對(duì)象__。獲得一個(gè)可用的類需要三步

加載,由類加載器完成。找到字節(jié)碼并創(chuàng)建一個(gè)Class對(duì)象。

鏈接,檢驗(yàn)字節(jié)碼,為static字段分配存儲(chǔ)空間,解決其對(duì)他類的引用。

初始化,如果有父類則初始化父類,執(zhí)行靜態(tài)初始化器和靜態(tài)初始化區(qū)塊

直到第一次訪問(wèn)靜態(tài)成員時(shí)初始化才執(zhí)行。

Class.forName()獲得引用則會(huì)引起初始化。

如果static final成員是編譯時(shí)常量,訪問(wèn)這個(gè)成員則不會(huì)引起初始化。如果static final成員不是編譯時(shí)常量(由初始化器賦值),也會(huì)引起初始化。訪問(wèn)不是final的static成員總會(huì)引起鏈接和初始化,即分配存儲(chǔ)和初始化值。

Generic class references

Class <=> Class

使用generic語(yǔ)法可以讓你在編譯時(shí)就發(fā)現(xiàn)類型不對(duì)的錯(cuò)誤。只用Class的話,如果犯了錯(cuò)誤到運(yùn)行時(shí)才會(huì)發(fā)現(xiàn)。

New cast syntax
//: typeinfo/ClassCasts.java
class Building {}
class House extends Building {}

public class ClassCasts {
      public static void main(String[] args) {
        Building b = new House();
        Class houseType = House.class;
        House h = houseType.cast(b);
        h = (House)b; // ... or just do this.
      }
} ///:~
Checking before a cast

RTTI的三種形態(tài):

傳統(tǒng)的類型轉(zhuǎn)換,使用RTTI來(lái)確保類型轉(zhuǎn)換時(shí)正確,如果不正確會(huì)拋出ClassCastException異常

Class object表示對(duì)象的類型。Class對(duì)象可以提供很有用的運(yùn)行時(shí)信息。

instanceof,檢驗(yàn)對(duì)象是不是某類型。(動(dòng)態(tài)Class.islnstance())

反射

RTTI可以提供類型信息,但是如果在編譯時(shí)并不知道對(duì)象所屬類的信息(比如從硬盤或網(wǎng)絡(luò)讀取的字節(jié)所組成的類),則無(wú)法使用RTTI。

Class類和java.lang.reflect中的Field, Method, and Constructor(實(shí)現(xiàn)了Member接口)一起支持了反射的概念。在運(yùn)行時(shí),JVM會(huì)創(chuàng)建這些類型的對(duì)象來(lái)表示未知類的成員。

使用反射前提是JVM可以找到未知類型的.class文件(從硬盤中的文件或者網(wǎng)絡(luò))。

RTTI在編譯時(shí),由編譯器打開和檢查.class文件。

在反射機(jī)制中,.class在編譯時(shí)是不可用的,.class是由運(yùn)行環(huán)境在運(yùn)行時(shí)打開和檢查的。

接口和類型信息

利用反射可以訪問(wèn)對(duì)象的方法和成員變量,不論訪問(wèn)修飾符是什么。但是反射不能修改final的變量,在運(yùn)行時(shí)試圖修改final字段不會(huì)報(bào)錯(cuò),但是實(shí)際上修改并沒有生效。

概念
class type .class文件 Class Class object Class reference
java中的類 類型,對(duì)應(yīng)于一個(gè)類,每個(gè)類都是一個(gè)類型 用來(lái)儲(chǔ)存Class對(duì)象,程序中編寫的每個(gè)類,都會(huì)被編譯成一個(gè).class文件 一種叫“Class”的類 Class類的一個(gè)實(shí)例,這個(gè)類由.class文件而來(lái),負(fù)責(zé)創(chuàng)建它所表示的類的實(shí)例 Class object的引用,包括了這個(gè)類的statics
其他小知識(shí)

一個(gè)類默認(rèn)的構(gòu)造器和這個(gè)類有相同的訪問(wèn)修飾符

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/70932.html

相關(guān)文章

  • Thinking in Java)第14章 類型信息

    摘要:通過(guò)運(yùn)行時(shí)類型信息,程序能夠使用基類的指針或引用來(lái)檢查這些指針或引用所指的對(duì)象的實(shí)際派生類型。編程應(yīng)該盡量面向接口編程,應(yīng)該對(duì)類型信息盡量的少了解二對(duì)象看書,書上寫得好靜態(tài)語(yǔ)句塊在這個(gè)類被加載的時(shí)候運(yùn)行。 一、為什么需要RTTI Run-Time Type Information。通過(guò)運(yùn)行時(shí)類型信息,程序能夠使用基類的指針或引用來(lái)檢查這些指針或引用所指的對(duì)象的實(shí)際派生類型。編程應(yīng)該盡量...

    tomorrowwu 評(píng)論0 收藏0
  • java-LearningRxjava-ch01-Thinking Reactively

    摘要:公司的和作為主要人員創(chuàng)作了其中在年月發(fā)布在年月發(fā)布。的核心理念是對(duì)象都是運(yùn)動(dòng)和變化的比如天氣。也是對(duì)象都是相互關(guān)聯(lián)的比如天氣和人的行為。對(duì)象的變化都是在同時(shí)并行的比如馬路上,機(jī)動(dòng)車道上的汽車和非機(jī)動(dòng)車道路上的人都是同時(shí)運(yùn)行的。 前言公司用到rxjava,學(xué)習(xí)Learning-Rxjava筆記本書源碼位置:https://github.com/PacktPubli... 1.A brie...

    Invoker 評(píng)論0 收藏0
  • 學(xué)習(xí)React系列2-[解讀]Thinking in React

    摘要:擴(kuò)展單一職責(zé)原則又稱單一功能原則,面向?qū)ο笪鍌€(gè)基本原則之一。馬丁表示此原則是基于湯姆狄馬克和的著作中的內(nèi)聚性原則發(fā)展出的。 [解讀]Thinking in React 原文:http://facebook.github.io/react/docs/thinking-in-react.html 前言 Thought is the seed of action 這是放置在官方的QUICK ...

    tomorrowwu 評(píng)論0 收藏0
  • Thinking in Java)第10章 內(nèi)部類

    摘要:內(nèi)部類中也可以取得這個(gè)外部類對(duì)象引用。創(chuàng)建成員內(nèi)部類對(duì)象的時(shí)候需要外部類對(duì)象。另外在方法中的內(nèi)部類不能加等權(quán)限修飾符,只能加和修飾符??梢栽诮涌趦?nèi)部定義內(nèi)部類,而且他們即使沒有修飾,也會(huì)自動(dòng)變成的。 Thinking in Java撈干貨,寫筆記 一、成員內(nèi)部類 1.最基本使用 public class Demo { class Contents{ privat...

    Brenner 評(píng)論0 收藏0
  • Thinking in Java)第20章 注解

    摘要:而這可以通過(guò)注解辦到,在代碼中以指令語(yǔ)言的形式化方法來(lái)為代碼提供更多信息。有注解的說(shuō)明這個(gè)成員變量是一個(gè)列名,然后根據(jù)注解信息來(lái)生成相應(yīng)的語(yǔ)句。也就是說(shuō)把注解信息提取了出來(lái)。 注解是向代碼中添加信息的一種方法,并且在之后還可以使用這些數(shù)據(jù)就比如這個(gè)方法是用來(lái)剝香蕉的,但是我們看就是一串代碼,我們沒辦法在代碼里寫一段指令說(shuō)我這個(gè)程序是用來(lái)剝香蕉的,當(dāng)然除了注釋。而這可以通過(guò)注解辦到,在代...

    劉玉平 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<