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】Class.forName用法以及和new的區別Java
- JAVA之反射學習1-如何獲取Class物件Java反射物件
- 【譯】2. Java反射——Class物件Java反射物件
- Class.forName和ClassLoader.loadClass的區別
- 反射_Class物件功能反射物件
- 【JAVA】Class.forName( )你搞懂了嗎Java
- java-----instanceof與getClass的區別Java
- 《轉》ParameterizedType getGenericSuperclass 獲取泛型引數;class getClass區別Zed泛型
- 反射+Class類方法_利用反射分析類的能力反射
- Java SE之反射技術[Class,Field](一)Java反射
- 反射--Class物件功能--獲取Method反射物件
- java基礎:深入理解Class物件與反射機制Java物件反射
- 【java反射】Class型別的相關操作演練Java反射型別
- Java之區域性匿名內部類物件Java物件
- Java中類與物件的關係與區別Java物件
- 【Java基礎知識】Java反射--Class、Constructor、Filed、Method類的使用Java反射Struct
- Java反射獲取類和物件資訊全解析Java反射物件
- Spring IOC 容器為什麼不使用 Class.forName 載入類Spring
- Facades 類別名設定流程 (class_alias)
- Scala進階(1)—— 反射 object 和 class反射Object
- Java反射 getFields()和getDeclaredFields()的區別Java反射
- 類例項物件的class型別卻不屬於該類,何解?物件型別
- OC 匯入類 #import和@class 區別複習Import
- Java Class物件簡介Java物件
- [Java基礎]Class物件Java物件
- 探究一下JDBC中的Class.forNameJDBC
- 反射-獲取class檔案物件的三種方式反射物件
- self::class和static::class的區別
- Java之反射Java反射
- PHP 物件導向 (十一)反射類PHP物件反射
- Java Class類詳解Java
- Class.forName 如何載入資料庫驅動資料庫
- java反射構建物件和方法的反射呼叫Java反射物件
- Java中Class類與Object類之間有什麼關係?JavaObject
- 【Java面試指北】反射(1) 初識反射Java面試反射
- 理解java.lang.Class類Java