1. 程式人生 > >類名.class, class.forName(), getClass()區別

類名.class, class.forName(), getClass()區別

1、類名.class
說明:JVM將使用類裝載器,將類裝入記憶體(前提是:類還沒有裝入記憶體),不對類做類的初始化工作。返回類的Class的物件。

2、Class.forName("類名字串")(注:類名字串是包名+類名)

說明:裝入類,並做類的靜態初始化,返回Class的物件。
3、例項物件o.getClass()

說明:對類進行靜態初始化、非靜態初始化;返回引用o執行時真正所指的物件(因為子物件的引用可能會賦給父物件的引用變數中)所屬的類的Class的物件。

.getClass()是動態的,其餘是靜態的。
.class和class.forName()只能返回類內field的預設值,getClass可以返回當前物件中field的最新值。
Class.forName() 返回的是一個類,.newInstance() 後才建立一個物件,Class.forName()的作用是要求JVM查詢並載入指定的類,也就是說JVM會執行該類的。

package reflect;

public class ClassTest {

	public ClassTest() {
		System.out.println("構造方法");
	}

	static {
		System.out.println("靜態引數的初始化");
	}

	{
		System.out.println("非靜態引數的初始化");
	}
}

package reflect;

public class Demo {
	public static void main(String[] args) throws Exception {
		// .class
		System.out.println(".class>>>" + ClassTest.class);

		// class.forName
		Class clazz = Class.forName("reflect.ClassTest");
		System.out.println("class.forName>>>" + clazz);

		// getClass
		System.out.println("getClass>>>" + new ClassTest().getClass());
	}
}

執行結果:
.class>>>class reflect.ClassTest
靜態引數的初始化
class.forName>>>class reflect.ClassTest
非靜態引數的初始化
構造方法
getClass>>>class reflect.ClassTest

三種方法生成的Class物件是一樣的,且程式只執行了一次“靜態引數的初始化”(Class.forName裝入類時做類的靜態初始化)。靜態方法是在類載入的時候初始化的,非靜態方法是在new物件的時候初始化的。由此可見此三種方法生成的是同一個Class物件。


通過程式碼來看下類名.class和getClass()的區別:

package reflect;
public class Father {

	public Father() {
		System.out.println("Father類的構造方法:");
		System.out.println("Father.class:" + Father.class);
		System.out.println("getClass():" + getClass());
	}

}

package reflect;
public class Son extends Father {

}

package reflect;
public class Demo {
	public static void main(String[] args) throws Exception {
		new Son();
	}
}

執行結果:
Father類的構造方法:
Father.class:class reflect.Father
getClass():class reflect.Son

從結果看來,getClass()獲取的是實際執行的類的位元組碼,它不一定是當前類的Class,有可能是當前類的子類的Class,具體是哪個類的Class,需要根據實際執行的類來確定,new的是哪個類,getClass()獲取的就是哪個類的Class;而類.class獲取得到的Class永遠只能是該類的Class。

相關推薦

.class, class.forName(), getClass()區別

1、類名.class 說明:JVM將使用類裝載器,將類裝入記憶體(前提是:類還沒有裝入記憶體),不對類做類的初始化工作。返回類的Class的物件。2、Class.forName("類名字串")(注:類名字串是包名+類名) 說明:裝入類,並做類的靜態初始化,返回Class的物

java中Class物件詳解和.class, class.forName(), getClass()區別

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

.class Class.forName("的全路徑") 物件例項.getClass區別

      首先,三種方式均為獲取該類的一個類物件。那什麼是類物件呢?實際上,在Java中每一個類在被編譯成為.class檔案的時候,JVM(Java虛擬機器)都將會自動對每一個類建立一個類物件,這個類物件包含了這個類的所有的資訊(包括成員變數、方法、構造器)。今後我們在建

.class.this的區別

類名.class我們知道在java中,一個類在被載入的時候虛擬機器就會自動的生成一個這個類的一個Class型別的“類物件”,每個類都對應著一個這樣的類物件,通過這個Class型別的類物件,我們就能夠使用“內省與反射”機制,訪問一個類的資訊,比如:對應類中的方法有哪些,成員域有

通過js獲取class的函數封裝

clas ret -1 .class class urn getclass ++ 不同 通過className獲取元素,不同的瀏覽器會有不同的支持情況,所以為了兼容各個瀏覽器在這裏,我寫了幾個函數獲取className的值 function byclass(classn){

java中接口(interface)和虛基(abstract class)的區別

private 特定 知識庫 價值 ceo 實現 相互 定義 協調 在Java語言中,abstract class和interface是支持抽象類定義的兩種機制。正是由於這兩種機制的存在,才賦予了Java強大的面向對象能力。abstract class和interface之

簡單談談我對Java 中 Class.forName()、Class.class、例項物件.getClass() 三種獲取位元組碼物件的理解?(內含程式碼分析和總結)

首先得明白的知識點: 1靜態屬性初始化載入類的時候初始化( 只會初始化一次),而非靜態屬性的初始化就是new類例項物件的時候初始化的 2三種獲取位元組碼物件的共同點就是都會預先的判斷記憶體是否已經載入此類,弱沒有載入,則會把.class檔案裝入到記憶體,若是載入了,則會根據class檔案生成例

.class

1.Class.form(className);動態載入類,類載入後需要建立物件 2.newClassName():靜態載入類 3.例項物件.getClass();   .getClass()是一個對例項物件的方法 getName():String:獲得該型別的全稱名稱。 getS

PHP ::class含義

5.5 col php names style 關鍵詞 完全 nbsp echo 自 PHP 5.5 起,關鍵詞 class 也可用於類名的解析。 使用 ClassName::class 可以獲取一個字符串,包含了類 ClassName 的完全限定名稱。這對使用了命名空間

Java中ClassLoader與Class.forName區別

Java中ClassLoader與Class.forName的區別 package com.demo.classLoader; public class Main { public static void main(String[] args) {

Java中的載入和Class.forName();java反射機制與原理

對於大部分人來說,第一次見到class.forName(String className)這句程式碼應該是在使用jdbc方式連線資料庫的時候。但這句程式碼本質上是什麼含義,做了什麼工作呢?本文將回答此問題。 理解Class.forName方法需要一些知識鋪墊,也就是

Error instantiating servlet class+你的包. 或者404錯誤的個人總結

原因1.web.xml檔案中servlet-class引數配置有誤 servlet-class標籤中,要按"包名.類名",我的web.xml中,djc為包名,InitParamServlet為servl

Java內部類(inner Class)和巢狀(static inner Class)也就是靜態內部類的區別

內部類和靜態類有著本質的區別,有點類似普通成員變數和靜態成員變數的區別。 . 內部類可以看成是外部類的普通成員變數,這個成員變數可以使用外部類的屬性(靜態和非靜態),可以呼叫外部類的方法(靜態和非靜態),而且內部類還持有外部類物件作為其自身的一個屬性,這個屬

Java的內部類(Inner Class)和巢狀(Nested Class)的區別

內部類是類中類(內部類不為同一包的其他類可見,具有很好的封裝性),分為靜態內部類,成員內部類,區域性內部類以及匿名內部類;區域性內部類寫在方法裡面;用到最多的就是匿名內部類,例子如下: 首先定義一個介面:Interface A{ public void method();}

react動態渲染class(條件渲染)

  前提:有時候在開發過程中需要動態渲染類名,比如高亮顯示,active狀態等。 下面是react寫法,記錄一下: <div className={counts>0?"logo highlight":"logo"} > <Icon c

eclipse ctrl+滑鼠左鍵並點選不跳轉到class而是跳轉到jar包設定

目標: eclipse ctrl+滑鼠左鍵點選類名不跳轉到class類而是跳轉到jar包設定 問題描述:剛一開始我點選【ctrl+滑鼠左鍵】選擇某個類名:com.apache.testClass  會自動跳轉到類:test.jar中,但是不知道為何突然,每次點的時候  

抽象(abstract class)和介面(Interface)的區別

前言 抽象類(abstract class)和介面(Interface)是Java語言中對於抽象類定義進行支援的兩種機制,賦予了Java強大的面向物件能力。二者具有很大的相似性,甚至可以相互替換,因此很多開發者在進行抽象類定義時對於abstractclass和Interfa

java介面(interface)與抽象(abstract class)的區別

很久沒有看到如此精闢的文章了!作者寫得實在太好了!正在學JAVA或者想了解抽象類與介面的朋友,絕對不可錯過!本人極力推薦! OOP中介面與抽象類的區別 Java語言介面與繼承的本質 深入理解介面和抽象類   OOP中介面與抽象類的區別 OOP中的INTERFACE和ABST

物件,.class.this

轉自:http://blog.csdn.net/cto_51/article/details/8962357 1.當在內部類中使用this指的就是內部類的物件, 為了訪問外層類物件,就可以使用外層類名.this來訪問。 2. 在java中,每個class都有一個相

Java:Class的靜態方法forName()

在說明Class類的靜態方法forName()之前,先清楚有關Class類的幾個概念: 1、Class類封裝了類或介面的執行時狀態 Java程式在執行時,Java執行時系統一直對所有的物件進行所謂的執行時型別標識,這些標示紀錄了每個物件所屬的類。虛擬機器通常使用執行時型別資