1. 程式人生 > >Spring 筆記 -02- Class.forName 運用反射的原理建立物件

Spring 筆記 -02- Class.forName 運用反射的原理建立物件

Spring 筆記 -02- Class.forName 運用反射的原理建立物件

本篇注意介紹對映機制,不必糾結資料

建立專案:

(1)建立專案我就省了,詳情檢視上一篇:Spring 筆記 -01- JUnit 單元測試

(2)先看一下完整目錄:
(MyClass 用不著)

(3)新建 java 類,設定成介面 interface,命名為 ITrans.java,程式碼為:

package com.learn01;

public interface ITrans {
    public double speed(double A, double B,double C);

}

(4)新建實現類,Plane.java:

package com.learn01;

public class Plane implements ITrans{
    public double speed(double A, double B,double C){
        return A*B-C;
    }
}

(5)新建測試類,TestTrans.java:
提示:
(1)JOptionPane 是一個彈出對話方塊
(2)car 就是一箇中間變數,通過輸入的名字,來找自己的實現類,這樣我們可以通過在輸入的時候輸入不同的實現類名,而不需要修改程式碼。
(3)注意名稱的對應

package com.learn01;

import org.junit.Test;

import javax.swing.*;

public class TestTrans {
    @Test
    public void test(){
        try {
            String car = JOptionPane.showInputDialog("請輸入");
            ITrans common = (ITrans) Class.forName("com.learn01."+car).newInstance();
            double time = 1000/common.speed(32,65,11);
            System.out.println(car + "=" + time);

        } catch(Exception e){
            System.out.println(e.getMessage());
        }
    }
}

(6)這裡是單元測試,可以執行
在這裡插入圖片描述

在這裡插入圖片描述

Class.forName()的作用與使用總結

Java 程式在執行時,Java 執行時系統一直對所有的物件進行所謂的執行時型別標識。這項資訊紀錄了每個物件所屬的類。虛擬機器通常使用執行時型別資訊選準正確方法去執行,用來儲存這些型別資訊的類是 Class 類。Class 類封裝一個物件和介面執行時的狀態,當裝載類時, Class 型別的物件自動建立。
Class 沒有公共構造方法。Class 物件是在載入類時由 Java 虛擬機器以及通過呼叫類載入器中的 defineClass 方法自動構造的,因此不能顯式地宣告一個 Class 物件。
虛擬機器為每種型別管理一個獨一無二的 Class 物件。也就是說,每個類(型)都有一個 Class 物件。執行程式時,Java 虛擬機器(JVM)首先檢查是否 所要載入的類對應的 Class 物件是否已經載入。如果沒有載入,JVM 就會根據類名查詢 .class 檔案,並將其 Class 物件載入。
基本的 Java 型別(boolean、byte、char、short、int、long、float 和 double)和關鍵字 void 也都對應一個 Class 物件。
每個陣列屬於被對映為 Class 物件的一個類,所有具有相同元素型別和維數的陣列都共享該 Class 物件。
一般某個類的 Class 物件被載入記憶體,它就用來建立這個類的所有物件。

如何得到 Class 的物件呢?
有三種方法可以的獲取:
1、呼叫Object類的getClass()方法來得到Class物件,這也是最常見的產生Class物件的方法。例如:
MyObject x;
Class c1 = x.getClass();

2、使用Class類的中靜態forName()方法獲得與字串對應的Class物件。例如:
Class c2=Class.forName(“MyObject”),Employee必須是介面或者類的名字。

3、獲取 Class 型別物件的第三個方法非常簡單。如果 T 是一個 Java 型別,那麼 T.class 就代表了匹配的類物件。例如
Class cl1 = Manager.class;
Class cl2 = int.class;
Class cl3 = Double[].class;
注意:Class 物件實際上描述的只是型別,而這型別未必是類或者介面。例如上面的 int.class 是一個 Class 型別的物件。由於歷史原因,陣列型別的 getName 方法會返回奇怪的名字。

Class 類的常用方法

1、getName()

一個Class物件描述了一個特定類的屬性,Class類中最常用的方法getName以 String 的形式返回此 Class 物件所表示的實體(類、介面、陣列類、基本型別或 void)名稱。

2、newInstance()

Class 還有一個有用的方法可以為類建立一個例項,這個方法叫做newInstance()。例如:
x.getClass.newInstance(),建立了一個同 x 一樣型別的新例項。newInstance()方法呼叫預設構造器(無引數構造器)初始化新建物件。

3、getClassLoader()

返回該類的類載入器。

4、getComponentType()
返回表示陣列元件型別的 Class。

5、getSuperclass()
返回表示此 Class 所表示的實體(類、介面、基本型別或 void)的超類的 Class。

6、isArray()
判定此 Class 物件是否表示一個數組類。

三、Class的一些使用技巧

1、forName和newInstance結合起來使用,可以根據儲存在字串中的類名建立物件。例如
Object obj = Class.forName(s).newInstance();

2、虛擬機器為每種型別管理一個獨一無二的Class物件。因此可以使用==操作符來比較類物件。例如:
if(e.getClass() == Employee.class)…

更多文章連結