java反射(1) 之class.forName(""), 類名.class, 物件.getClass()區別
1、先說class.forName("")
先看API
public static Class<?> forName(String className)
throws ClassNotFoundException返回與帶有給定字串名的類或介面相關聯的 Class 物件。呼叫此方法等效於:
Class.forName(className, true, currentLoader)(此來源Class的另一個方法
public static Class<?> forName(String name, boolean initialize, ClassLoader loader) throws ClassNotFoundException)
其中 currentLoader 表示當前類的定義類載入器。
例如,以下程式碼片段返回命名為 java.lang.Thread 的類的執行時 Class 描述符。
Class t = Class.forName("java.lang.Thread")
呼叫 forName("X") 將導致命名為 X 的類被初始化。
true表示用載入器載入這個類生成Class物件的同時,並且初始化這個類。
package com.testclass;
public class TestClass {
public static void main(String[] args) {
try {
Class c = Class.forName("com.testclass.Test");
System.out.println(c.getName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
class Test {
static {
System.out.println("執行靜態塊,初始化類");
}
public Test() {
System.out.println("構造方法執行");
}
}
輸出:
執行靜態塊,初始化類
com.testclass.Test
說明當使用Class.forName("")進行反射生成Class物件的時候,執行了這個類的靜態程式碼,初始化了這個類
補充:Class.forName(xxx.xx.xx) 返回的是一個類, .newInstance() 後才建立一個物件 Class.forName(xxx.xx.xx);的作用是要求JVM查詢並載入指定的類,也就是說JVM會執行該類的靜態程式碼段 (來源http://blog.csdn.net/ozwarld/article/details/8277361)
2、類名.class
JVM將使用類A的類裝載器,將類A裝入記憶體(前提是:類A還沒有裝入記憶體),不對類A做類的初始化工作.返回類A的Class的物件
package com.testclass;
public class TestClass {
public static void main(String[] args) {
Class c = Test.class;
System.out.println(c.getName());
}
}
class Test {
static {
System.out.println("執行靜態塊,初始化類");
}
public Test() {
System.out.println("構造方法執行");
}
}
輸出:
com.testclass.Test
也就是說利用類名.class進行反射生成Class物件的時候,不會初始化這個類,更不會執行這個類的靜態程式碼
3、物件.getClass()
Class cl=物件引用.getClass();返回引用o執行時真正所指的物件所屬的類的Class物件(因為:兒子物件的引用可能會賦給父物件的引用變數中,也就是上轉型物件)
就是現有物件然後再通過這個物件用Class cl=物件引用.getClass()得到Class物件
但是在靜態方法中不能用this.getClass()得到這個類的Class物件。原因當然是靜態方法中不能用this的原因了
相關文章
- Java之.class和.getClass()的區別Java
- java反射之Class類Java反射
- JAVA之反射學習1-如何獲取Class物件Java反射物件
- Class.forName和ClassLoader.loadClass的區別
- java-----instanceof與getClass的區別Java
- 反射_Class物件功能反射物件
- 《轉》ParameterizedType getGenericSuperclass 獲取泛型引數;class getClass區別Zed泛型
- Java SE之反射技術[Class,Field](一)Java反射
- 反射--Class物件功能--獲取Method反射物件
- java基礎:深入理解Class物件與反射機制Java物件反射
- Facades 類別名設定流程 (class_alias)
- Java之區域性匿名內部類物件Java物件
- Spring IOC 容器為什麼不使用 Class.forName 載入類Spring
- Java中類與物件的關係與區別Java物件
- Scala進階(1)—— 反射 object 和 class反射Object
- Java Class物件簡介Java物件
- [Java基礎]Class物件Java物件
- 類例項物件的class型別卻不屬於該類,何解?物件型別
- 探究一下JDBC中的Class.forNameJDBC
- PHP 物件導向 (十一)反射類PHP物件反射
- self::class和static::class的區別
- java反射構建物件和方法的反射呼叫Java反射物件
- 【JRebel 作者出品--譯文】Java class 熱更新:關於物件,類,類載入器Java物件
- JDBC連線中Class.forName("")到底幹了什麼?JDBC
- SCSS @mixin和class 區別CSS
- Java虛擬機器之Class類檔案結構Java虛擬機
- Java jvm 類載入 反射JavaJVM反射
- Python物件導向之九:反射Python物件反射
- Java synchronized物件級別與類級別的同步鎖Javasynchronized物件
- 【Java面試指北】反射(1) 初識反射Java面試反射
- 關於forName()、newInstance()、getMethod()、getClass()等區別的簡略說明
- Java動態獲取實現類 Class.forName(clazz).newInstance()和applicationContext.getBean, bean Map尋找方式,Java Map定義和初始化方法JavaAPPContextBean
- JAVA特性 之 反射(Reflection)Java反射
- Java中的類反射機制Java反射
- 通過反射獲取私有內部類物件反射物件
- 反射獲取注入到spring中的類物件的工具類反射Spring物件
- Java安全基礎之Java反射機制和ClassLoader類載入機制Java反射
- 從Class原始碼看反射原始碼反射
- Java 物件和類Java物件