Java反射02 : Class物件獲取的三種方式和通過反射例項化物件的兩種方式
1.Class物件獲取的三種方式
上一章節已經說過,一般情況下,Java反射操作都需要首先獲取Class物件。獲取Class物件的方式有三種。
- 公有屬性class
- 方法getClass()
- Class.forName()
下面是示例程式碼:
/**
* <p>Title: Java獲取Class物件的三種方式</p>
* @author 韓超 2018/2/24 13:56
*/
public class ReflectClassDemo {
/** log4j */
private static final Logger LOGGER = Logger.getLogger(ReflectClassDemo.class);
/**
* <p>獲取Class物件的三種方式</p>
* @author hanchao
*/
public static void main(String[] args) throws ClassNotFoundException {
LOGGER.info("獲取Class物件方式01:類的public屬性class");
Class clazz1 = User.class;
LOGGER.info(clazz1);
System.out.println();
LOGGER.info("獲取Class物件方式02:類的public方法getClass()");
User user = new User();
Class clazz2 = user.getClass();
LOGGER.info(clazz2);
System.out.println();
LOGGER.info("獲取Class物件方法03:Class.forName(需要丟擲異常)");
Class clazz3 = Class.forName("pers.hanchao.reflect.common.User");
LOGGER.info(clazz3);
}
}
執行結果:
2018-02-24 13:59 :06 INFO ReflectClassDemo:18 - 獲取Class物件方式01:類的public屬性class
2018-02-24 13:59:06 INFO ReflectClassDemo:20 - class pers.hanchao.reflect.common.User
2018-02-24 13:59:06 INFO ReflectClassDemo:23 - 獲取Class物件方式02:類的public方法getClass()
2018-02-24 13:59:06 INFO ReflectClassDemo:26 - class pers.hanchao.reflect.common.User
2018-02-24 13:59:06 INFO ReflectClassDemo:29 - 獲取Class物件方法03:Class.forName(需要丟擲異常)
2018-02-24 13:59:06 INFO ReflectClassDemo:31 - class pers.hanchao.reflect.common.User
總結:
- 通過公有屬性class獲取Class物件:通過類獲取,無需建立類物件。
- 通過方法getClass()獲取Class物件:需要類的物件。常用於不知道類名但是能獲取物件的情況下。
- 通過方法Class.forName()獲取Class物件:需要類的全名,需丟擲異常。常用於載入配置。
2.通過反射例項化物件的兩種方式
除了通過new
例項化物件,我們還可以通過反射例項化物件物件,有兩種方式:
- Class.newInstance()
- Constructor.newInstance()
下面是示例程式碼:
/**
* 通過反射建立物件的兩種方式
* Created by 韓超 on 2018/2/24.
*/
public class CreateObjectDemo {
private final static Logger LOGGER = Logger.getLogger(CreateObjectDemo.class);
/**
* <p>Title: 通過反射建立物件的兩種方式</p>
* @author 韓超 2018/2/24 14:11
*/
public static void main(String[] args) throws Exception {
//通過new例項化物件
User user = new User();
LOGGER.info("通過new例項化物件:" + user.toString());
//通過反射例項化物件
Class userClass = User.class;
//通過反射例項化物件01-Class.newInstance()(需要強制型別轉換[無參構造])
User user1 = (User) userClass.newInstance();
LOGGER.info("通過反射例項化物件01-Class.newInstance()(需要強制型別轉換[無參構造]):" + user1.toString());
//通過反射例項化物件02-Constructor.newInstance()(需要強制型別轉換[可帶引數])
Constructor constructor = userClass.getDeclaredConstructor();
User user2 = (User) constructor.newInstance();
LOGGER.info("通過反射例項化物件02-Constructor.newInstance()(需要強制型別轉換[無參構造]):" + user2.toString());
Constructor constructor1 = userClass.getDeclaredConstructor(String.class,String.class);
User user3 = (User) constructor1.newInstance("李四","000000");
LOGGER.info("通過反射例項化物件02-Constructor.newInstance()(需要強制型別轉換[有參構造]):" + user3.toString());
}
}
執行結果:
2018-02-24 14:23:29 INFO CreateObjectDemo:22 - 通過new例項化物件:User{username='張三', password='123456'}
2018-02-24 14:23:29 INFO CreateObjectDemo:27 - 通過反射例項化物件01-Class.newInstance()(需要強制型別轉換[無參構造]):User{username='張三', password='123456'}
2018-02-24 14:23:29 INFO CreateObjectDemo:31 - 通過反射例項化物件02-Constructor.newInstance()(需要強制型別轉換[無參構造]):User{username='張三', password='123456'}
2018-02-24 14:23:29 INFO CreateObjectDemo:34 - 通過反射例項化物件02-Constructor.newInstance()(需要強制型別轉換[有參構造]):User{username='李四', password='000000'}
總結:
- 通過Class.newInstance()進行物件例項化:實際呼叫的是無引數的建構函式進行例項化。
- 通過Constructor.newInstance()進行物件例項化:可以選擇呼叫哪個建構函式進行例項化。
相關推薦
Java反射02 : Class物件獲取的三種方式和通過反射例項化物件的兩種方式
1.Class物件獲取的三種方式 上一章節已經說過,一般情況下,Java反射操作都需要首先獲取Class物件。獲取Class物件的方式有三種。 公有屬性class 方法getClass()
Android Studio3.0之前的6種依賴方式和3.0之後新增的兩種依賴方式
一 3.0之前的6種方式 共發現6中方式 Compile,Provided,APK,Test compile,Debug compile,Release compile 1.1 Compile 對所有的build type以及f
java 反射(一) 獲取Class物件的三種方式
package com.reflect; /** * 三種獲得Class物件的方式 * @author lr * */ public class Demo1 { public static void main(String[] args) throws ClassNotFound
Java反射的定義以及獲取class物件的三種方式
1、什麼是反射技術? java反射機制是在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意一個方法和屬性。 應用程式已經執行,無法在其中進行new物件的建立,就無法使用物件。這時可以根據配置檔案的類全名去找對應的位元組碼檔案(class檔案)
Java反射之獲取Class物件的三種方式
package cn.itcast.reflect.demo; import cn.itcast.bean.Person; /* * JAVA反射機制是在執行狀態中,對於任意一個類 (class檔案),都能夠知道這個類的所有屬性和方法; * 對於任意一個物件,都能夠呼叫它的任意一個方法
java 反射之獲取class物件的三種方式
獲取Class檔案物件有3種方法: 1.Object類的getClass()方法 2.資料型別中的靜態變數 類名.Class 3.Class類中的靜態方法 pub
JAVA反射(一)獲取Class物件的三種方式及其區別
JAVA有三種方式可以獲得Class物件 1、通過類名.class方式獲得,Class<?> cType = ClassName.class; public class Client {public static void main(String[] args
Java 獲取Class物件的三種方法
Java中的java.lang.Class,簡單理解就是為每個java物件的型別標識的類,虛擬機器使用執行時型別資訊選擇正確的執行方法,用來儲存這些執行時型別資訊的就是Class類。虛擬機器為每種型別管理一個獨一無二的物件,即Class物件,當類被載入時,對應的Class型
Java中的Class類以及獲取Class物件的三種方式
java.lang.Class 之前Hadoop裡面job.setMapperClass(Map.class)之類的方法用到了 xxx.class的寫法,當時也沒有深究。這兩天又遇到了xxx.getClass()的寫法,稍微看了一下。 java API裡這樣寫道: Class 類的例項表示正在執行的
3、獲取Class物件的三種方式
3、獲取Class物件的三種方式 要想對位元組碼檔案進行解刨,必須要有位元組碼檔案物件 Object類中的getClass方法 通過物件靜態屬性 .class來獲取對應的Class物件 只要通過給定類的字串名稱就可以獲取該類,更為拓展 3.1 方式一:Object類中的getClass
獲取Class物件的三種獲取方式:
方法一:通過object類中的getClass方法 //雖然通用,但是前提是必須有指定類,並對該類進行物件的建立,才可以呼叫getclass方法。 方法二:使用任意資料型別的一個靜態成員:clas
Java反射建立類物件的三種實現方法
public class Main { public static void main(String[] args) { //Foo的例項物件建立 Foo foo = new Foo("abcdefgh"); //Class類的例項物
獲取Class物件的三種方式
//綜合最好的方法是第三種方法/**法一:是通過類物件來獲取class的*法二:通過類直接調class*法三:通過Class.forName();*/package hncu.reflect.getClass;import java.lang.reflect.Method;i
獲取Class物件的三種方法
1、呼叫Object類的getClass()方法來得到Class物件,這也是最常見的產生Class物件的方法。例如: MyObject x; Class c1 = x.getClass(); 2、使用Class類的中靜態forName()方法獲得與字
Java——深入理解Class物件(二):Class物件的載入及其獲取方式
上一篇部落格Java——深入理解Class物件(一)帶大家簡單認識了一下Java中Class物件。 現在帶大家瞭解一下Class物件的載入及其獲取方式。 1.Class物件的載入 在Java——深入理解Class物件(一)我們已提到過,Class物件是由JVM載入的,那它必然不會是胡亂載
Java型別資訊(Class物件)與反射機制
RRTI的概念以及Class物件作用 RTTI(Run-Time Type Identification)執行時型別識別,對於這個詞一直是 C++ 中的概念,至於Java中出現RTTI的說法則是源於《Thinking in Java》一書,其作用是在執行時識別一個物件的型別
Java型別資訊(Class物件)與反射機制-1
RRTI的概念以及Class物件作用 RTTI(Run-Time Type Identification)執行時型別識別,對於這個詞一直是 C++ 中的概念,至於Java中出現RTTI的說法則是源於《Thinking in Java》一書,其作用是在執行時識別一個物件的型別
深入理解Java型別資訊(Class物件)與反射機制
關聯文章: 本篇主要是深入對Java中的Class物件進行分析,這對後續深入理解反射技術非常重要,主要內容如下: 深入理解Class物件 RRTI的概念以及Class物件作用 認識Class物件之前,先來了解一個概念,RTTI(Run-Time
Java獲得位元組碼物件的三種方式
1.Class 類的forName方法 Class clazz = Class.forName("com.ashin.bean.Book"); 該方法要注意的是會丟擲一個ClassNotFoundException因為輸入的字串代表的類可能不存在。 2
Java——深入理解Class物件(一):什麼是Class物件
Class類是我們再熟悉不過的東西,但是對於Class物件,很多人卻是一臉懵逼。 Class物件到底是什麼呢?今天我們就來深入瞭解一下它。 1.RTTI的概念 RTTI(Run-Time Type Identification),即執行時型別識別,這個詞一直是 C++ 中的概念,至