1. 程式人生 > >Java Class物件詳解

Java Class物件詳解

要怎樣在java裡來使用一個類,首先必須先把類的.class位元組碼檔案載入進來,然後再進行連線對該類裡的域分配記憶體,最後再呼叫構造器,如果該類有基類的話,會先去呼叫基類的構造器,總的來說,分為以下三個步驟。

1.根據環境變數找到並載入.class檔案
2.為該類的非編譯時常量分配記憶體
3.呼叫該類的構造器

java裡的所有類都有一個Class物件,通過這個Class物件我們能夠獲取此類的各種資訊。
當某個位元組碼檔案被JVM載入的時候,Class物件就被建立。
Class類沒有構造方法,是內部的一個defineClass方法來建立此物件的,此物件與被載入的位元組碼檔案的類的型別相對應。

其實在java裡包括基本資料型別(int short long byte float double boolean char),也包括了void

        System.out.println(int.class.getName());
        System.out.println(char.class.getName());
        System.out.println(short.class.getName());
        System.out.println(long.class.getName());
        System.out.println(byte.class.getName());
        System.out.println(float.class.getName());
        System.out.println(double.class.getName());
        System.out.println(boolean.class.getName());
        System.out.println(void.class.getName());

都有與之對應的class物件,同類型的型別也共享一個class物件。也包括了陣列,所有同類型同維度的陣列也共享一個class物件。

public class Main {
    public static void main(String[] args) {
        System.out.println(char[].class.getName());//[C
        System.out.println(char[][].class.getName());//[[C
    }
}

class的forName方法

同時class裡有一個static的方法forName,可以讓我們顯示的來把一個類的.class檔案載入至JVM虛擬機器。

static Class< ? > forName(String className)

public class Main {
    public static void main(String[] args) throws Exception{
        Class a = Class.forName("A");
    }
}

class A{
    void print(){
        System.out.println("hello world");
    }
}

該方法返回的是一個Class物件,這個Class物件也可以新增泛型。
這樣的話我們就獲得一個與A型別對應的Class物件。
但是這時編譯器會強制的讓我們丟擲或者捕獲這個異常,所以我們需要將它捕獲或者丟擲。

接下來我們還能過載一個A類的private的構造器(注:預設的構造器是隱式的static,我們過載之後就不再是static),但是我們仍然能獲取它的class物件,因為呼叫構造器是在最後一步,而我們這裡只是載入.class檔案。

public class Main {
    public static void main(String[] args) throws ClassNotFoundException {
        Class a = Class.forName("A");
    }
}


class A{
    private A(){
        
    }
    void print(){
        System.out.println("hello world");
    }
}

這段程式碼是毫無錯誤的

但是直到現在我們都還不能通過Class.forName來操作一個類,因為它只是簡單的載入而已,但是沒關係Class類還有一個newInstance方法,這個方法能幫助我們建立一個class類的例項,我們只需顯示的轉換一下型別即可操作A類.

public class Main {
    public static void main(String[] args) throws Exception {
        A a = (A)Class.forName("A").newInstance();
        a.print();
    }
}


class A{
    
    void print(){
        System.out.println("hello world");
    }
}

這時,其實我們得到的就是一個A型別的例項了。

但是如果我們這時把A的構造方法宣告為private呢?

public class Main {
    public static void main(String[] args) throws Exception {
        A a = (A)Class.forName("A").newInstance();
        a.print();
    }
}


class A{
    private A(){
        
    }
    void print(){
        System.out.println("hello world");
    }
}

編譯器是仍然不會報錯的,但是如果我們執行這段程式碼就會發現會丟擲一個異常,因為這是在執行時載入的,所以編譯器是無法察覺的。這也是相當危險的,所以一般情況下我們都會遵守用new來建立物件。

既然class是執行時物件,那麼對於final static 宣告的域也是毫無作用的了,這麼說的原因是用final static宣告的域是不需要動態的來分配記憶體的,因為它是一個編譯時常量。

到現在我們大概明白了class的含義和運用,那它和.class有什麼聯絡呢。
其實每個類也有一個.class的常量,我們稱為類字面常量,這個常量能夠返回該類的class物件,也能通過newIstance建立例項來操作。

運用類字面常量的好處就在於不用去丟擲或者捕獲異常,所犯的錯誤在編譯時就能查找出來。

public class Main {
    public static void main(String[] args) throws Exception {
        A a = (A)A.class.newInstance();
        a.print();
    }
}


class A{
    void print(){
        System.out.println("hello world");
    }
}

封裝類的TYPE

這裡以boolean型別來說明這個問題

System.out.println(boolean.class == Boolean.TYPE);//true

所以我們得出基本型別的.class 和 封裝類的TYPE是等價的。

相關推薦

Java Class物件

要怎樣在java裡來使用一個類,首先必須先把類的.class位元組碼檔案載入進來,然後再進行連線對該類裡的域分配記憶體,最後再呼叫構造器,如果該類有基類的話,會先去呼叫基類的構造器,總的來說,分為以下三個步驟。 1.根據環境變數找到並載入.class檔案 2.為該類的非編譯時常量分配記憶體 3.呼叫該類的構造

javaClass物件和類名.class, class.forName(), getClass()區別

package yerasel; import java.lang.reflect.Method; public class Test { /** * @param args */ public static void main(String[] args) {

javaClass物件

 java中把生成Class物件和例項物件弄混了,更何況生成Class物件和生成instance都有多種方式。所以只有弄清其中的原理,才可以深入理解。首先要生成Class物件,然後再生成Instance。那Class物件的生成方式有哪些呢,以及其中是如何祕密生成的呢? Cl

Java Class檔案

Java Class檔案中包含以下資訊: ClassFile { u4 magic; //模數 u2 minor_version; //次版本號 u2

class物件

我們知道,對於java語言,我們一般先寫一個類物件,表示對某一類物件概述,其中包括屬性,方法等。我們在對類物件編譯時,會產生一個.class物件,jvm在載入類物件時,是載入.class 物件檔案,我們一般例項化物件,也就是 new物件時,其實是在載入.class檔案,然後例項物件。載入.class物件有3種

java class檔案

一、概述 各種不同平臺的Java虛擬機器, 以及所有平臺都統一支援的程式儲存格式——位元組碼(Byte Code)是構成平臺無關性的基石,所以class檔案主要用於解決平臺無關性的中間檔案。如下圖所示:       java虛擬機器不與包括Java語言在內的任何程

Java面向物件-上

### 一、類及物件 #### 1. 類的組成成分 - 屬性(成員變數,Field) - 方法(成員方法,函式,Method) #### 2. 屬性 成員變數 vs 區域性變數 - 相同點: - 遵循變數宣告的格式: 資料型別 變數名 = 初始化值 - 都有作用域 - 不同點: - 宣告

Java面向物件-下

### 一、 static 1. static:靜態的,可以用來修飾屬性、方法、*程式碼塊(或初始化塊)、*內部類 2. static修飾屬性(類變數): - 由類建立的所有的物件,都共用這一個屬性 - 當其中一個物件對此屬性進行修改,會導致其他物件對此屬性的一個呼叫。vs 例項變數(非stat

java 內部類(inner class

ron isp https nerd 對象 重寫 prot print 元素 優點 ⒈ 內部類對象可以訪問創建它的對象的實現,包括私有數據; ⒉ 內部類不為同一包的其他類所見,具有很好的封裝性; ⒊ 使用內部類可以很方便的編寫事件驅動程序; ⒋ 匿名內部類可以方便的定義運行

Java-API-Class、用法及泛化

Java-API-Class類詳解、用法及泛化 轉載宣告: 本文系轉載自以下文章: Java中Class類詳解、用法及泛化 作者: 老白講網際網路 轉載僅為方便學習檢視,一切權利屬於原作者,本人只是做了整理和排版,如果帶來不便請聯絡我刪除。 0x01 摘要

Java四大域物件(ServletContext、Session、Request、pageContext域物件

一、ServletContext 1、生命週期:當Web應用被載入進容器時建立代表整個web應用的ServletContext物件,當伺服器關閉或Web應用被移除時,ServletContext物件跟著銷燬。 2、作用範圍:整個Web應用。 3、作用:

java Request物件和Response物件

一:概述 Web伺服器收到客戶端的http請求,會針對每一次請求,分別建立一個用於代表請求的request物件、和代表響應的response物件 一、Response物件 1.Resonse的繼承結構: ServletResponse--H

Java內部類(Inner Class

重新來認識一下內部類的區別 1Static member class(靜態成員類) 類宣告中包含“static”關鍵字的內部類。如以下示例程式碼, Inner1/Inner2/Inner3/Inner4就是Outer的四個靜態成員類。靜態成員類的使用方式與一般頂層類的使用方式

Java 儲存模型和共享物件

Java 儲存模型和共享物件詳解 很多程式設計師對一個共享變數初始化要注意可見性和安全釋出(安全地構建一個物件,並其他執行緒能正確訪問)等問題不是很理解,認為Java是一個遮蔽記憶體細節的平臺,連物件回收都不需要關心,因此談到可見性和安全釋出大多不知所云。其實關鍵在於對Java儲存模型,可見性和

JavaClass、用法以及泛化

在前面我們將類的載入的時候,類載入一共有5步,載入,驗證,準備,解析和初始化。其中載入階段,除了將位元組碼載入到方法區,還生成了這個了的Java.lang.Class物件。那麼這個Class物件到底有什麼用呢? 前面的關於反射的文章,我們多次都用到了Class類,可以用這個

Java類和物件 (一)

一、面向物件簡述 面向物件是一種現在最為流行的程式設計方法,幾乎現在的所有應用都以面向物件為主了,最早的面向物件的概念實際上是由IBM提出的,在70年代的Smaltalk語言之中進行了應用,後來根據面向物件的設計思路,才形成C++,而由C++產生了Java這門

Java基礎】----static關鍵字、程式碼塊、Main方法、匿名物件

1.static關鍵字 static簡介 static是靜態的意思,是一個修飾符,能夠用於成員變數和成員屬性。 特點 能夠通過類名直接進行呼叫,被static修飾

java.securtiy KeyGenerator物件

KeyGenerator物件介紹:keyGenerator物件位於javax.crypto包下jdk 1.6 doc介紹:KeyGenerator 此類提供(對稱加密演算法:AES,DES 等等)金鑰生成器的功能獲得keyGenerator:一般是通過此類的靜態方法getIn

物件排序 — java 7 collection(三)

轉載自:http://peiquan.blog.51cto.com/7518552/1293970  承接著前兩篇collection講解,這一次繼續談一下在collection裡的物件排序。在談物件排序排序之前,先來了解一下,在java裡是如何判斷兩個物件是相等(同)

java.util包(二)——Connection接口

操作 相同 元素 叠代 cat roo soft true nbsp Connection接口介紹   Connection接口是java集合的root接口,沒有實現類,只有子接口和實現子接口的各種容器。主要用來表示java集合這一大的抽象概念。   Connection接