1. 程式人生 > >Java反射02 : Class物件獲取的三種方式和通過反射例項化物件的兩種方式

Java反射02 : Class物件獲取的三種方式和通過反射例項化物件的兩種方式

1.Class物件獲取的三種方式

上一章節已經說過,一般情況下,Java反射操作都需要首先獲取Class物件。獲取Class物件的方式有三種。

  1. 公有屬性class
  2. 方法getClass()
  3. 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

總結:

  1. 通過公有屬性class獲取Class物件:通過類獲取,無需建立類物件。
  2. 通過方法getClass()獲取Class物件:需要類的物件。常用於不知道類名但是能獲取物件的情況下。
  3. 通過方法Class.forName()獲取Class物件:需要類的全名,需丟擲異常。常用於載入配置。

2.通過反射例項化物件的兩種方式

除了通過new例項化物件,我們還可以通過反射例項化物件物件,有兩種方式:

  1. Class.newInstance()
  2. 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'}

總結:

  1. 通過Class.newInstance()進行物件例項化:實際呼叫的是無引數的建構函式進行例項化。
  2. 通過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++ 中的概念,至