首頁 >Java >java教程 >Java中反射機制的詳解

Java中反射機制的詳解

黄舟
黄舟原創
2017-10-16 10:19:261219瀏覽

這篇文章主要介紹了Java 反射機制的實例詳解的相關資料,希望透過本文能幫助大家,讓大家理解掌握反射機制,需要的朋友可以參考下

Java反射機制的實例詳解

前言

#今天介紹下Java的反射機制,以前我們取得一個類別的實例都是使用new一個實例出來。那太low了,今天跟我一起來學習學習一種更高大上的方式來實現。

正文

Java反射機制定義

Java反射機制是指在運作狀態中,對於任意一個類,都能夠知道這個類別的所有屬性和方法;對於任意一個對象,都能夠呼叫它的任意一個方法和屬性;這種動態取得的資訊以及動態呼叫對象的方法的功能稱為java語言的反射機制。 用一句話總結就是反射可以實現在運行時可以知道任意一個類別的屬性和方法。

反射機制的優點與缺點

為什麼要用反射機制?直接創建物件不就可以了嗎,這就涉及到了動態與靜態的概念

靜態編譯:在編譯時確定類型,綁定物件,即通過。

動態編譯:執行階段決定類型,綁定物件。動態編譯最大限度發揮了java的靈活性,體現了多態的應用,有以降低類別之間的藕合性。

優點

可以實現動態創建物件和編譯,體現出很大的靈活性,特別是在J2EE的開發中它的靈活性就表現的十分明顯。例如,一個大型的軟體,不可能一次就把它設計的很完美,當這個程式編譯後,發布了,當發現需要更新某些功能時,我們不可能要用戶把以前的卸載,再重新安裝新的版本,如果這樣的話,這個軟體肯定是沒有多少人用的。採用靜態的話,需要把整個程式重新編譯一次才可以實現功能的更新,而採用反射機制的話,它就可以不用卸載,只需要在運行時才動態的創建和編譯,就可以實現該功能。

缺點

對效能有影響。使用反射基本上是一種解釋操作,我們可以告訴JVM,我們希望做什麼並且它滿足我們的要求。這類操作總是慢於只直接執行相同的操作。

理解Class類別和類別類型

想要了解反射先理解Class類,它是反射實現的基礎。

類別是java.lang.Class類別的實例對象,而Class是所有類別的類別(There is a class named Class) 對於普通的對象,我們一般都會這樣建立和表示:


Code code1 = new Code();

上面說了,所有的類別都是Class的對象,那麼要如何表示呢,可不可以用如下方式呢:


Class c = new Class();

但是我們查看Class的原始碼時,是這樣寫的:


private Class(ClassLoader loader) { 
classLoader = loader; 
}

可以看到建構器是私有的,只有JVM可以建立Class的對象,因此不可以像普通類別一樣new一個Class對象,雖然我們不能new一個Class對象,但是卻可以透過已有的類別得到一個Class對象,共有三種方式,如下:


#
Class c1 = Code.class;

這說明任何一個類別都有一個隱含的靜態成員變數class,這種方式是透過取得類別的靜態成員變數class得到的


Class c2 = code1.getClass();

code1是Code的一個對象,這種方式是透過一個類別的物件的getClass()方法得到的


Class c3 = Class.forName(“com.trigl.reflect.Code”);

這種方法是Class類別呼叫forName方法,透過一個類別的全量限定名獲得,這裡,c1、c2、c3都是Class的對象,他們是完全一樣的,而且有個學名,叫做Code的類別類型(class type )。 這裡就讓人奇怪了,前面不是說Code是Class的對象嗎,而c1、c2、c3也是Class的對象,那Code和c1、c2、c3不就一樣了嗎?為什麼還叫Code什麼類別型?這裡不要糾結於它們是否相同,只要理解類類型是做什麼的就好了,顧名思義,類類型就是類的類型,也就是描述一個類是什麼,都有哪些東西,所以我們可以通過類類型知道一個類的屬性和方法,並且可以呼叫一個類別的屬性和方法,這就是反射的基礎。

舉個簡單範例程式碼:


public class ReflectDemo { 
public static void main(String[] args) throws ClassNotFoundException { 
//第一种:Class c1 = Code.class; 
Class class1=ReflectDemo.class; 
System.out.println(class1.getName());

  //第二种:Class c2 = code1.getClass();
  ReflectDemo demo2= new ReflectDemo();
  Class c2 = demo2.getClass();
  System.out.println(c2.getName());

  //第三种:Class c3 = Class.forName("com.trigl.reflect.Code");
  Class class3 = Class.forName("com.tengj.reflect.ReflectDemo");
  System.out.println(class3.getName());
}
}

執行結果:


com.tengj.reflect.ReflectDemo 
com.tengj.reflect.ReflectDemo 
com.tengj.reflect.ReflectDemo

Java反射相關操作

前面我們知道怎麼取得Class,那我們可以透過這個Class做什麼呢?

總結如下:

取得成員方法Method
取得成員變數Field
取得建構子Constructor

下面來具體介紹

取得成員方法資訊

單獨取得某一個方法是透過Class類別的下列方法獲得的:


##

public Method getDeclaredMethod(String name, Class c){

}

以上是Java中反射機制的詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn