2013-05-07 71 views
0

在過去的幾周裏,我使用.class對象碰到了幾個不同的人的代碼。例如,ArrayList of classes : ArrayList<Class> but how to force those classes to extend some super class?使用.class對象有什麼意義?

我看了起來:http://docs.oracle.com/javase/tutorial/reflect/class/index.html

我只是想知道爲什麼你要使用的.class對象。我可以看到getDeclaredFields()getDeclaredMethods()可能是有用的,但我真的不能想到具體的例子,爲什麼我實際上想要使用.class對象來代替別的東西。任何人都可以對這個話題有所瞭解嗎?

在此先感謝。

+2

「代替別的東西」代替什麼,究竟是什麼? – SLaks 2013-05-07 13:53:01

+0

您會喜歡[事件處理程序](http://docs.oracle.com/javase/tutorial/uiswing/events/generalrules.html#eventHandlers)。它也使用'.class'。 – johnchen902 2013-05-07 13:53:59

+1

我想你誤解了這個概念。 'Class'類與編譯類('.class')無關。 – m0skit0 2013-05-07 13:55:27

回答

3

我想你誤解了這個概念。 Class類與編譯類無關(.class)。

Class是一個表示Java類內部結構的類,例如字段,方法等......這是一個編譯時實體,您可以在代碼中使用它(甚至在編譯之前)。

.class是一個已編譯的Java類文件,它是Java字節碼。這不是一個「代碼」實體(不能將其用作代碼中的類或對象,如同任何文件一樣),它在編譯之前不可用。

反射(Class是反射包的一部分),當你想要做先進的東西與代碼,例如操縱它,訪問它的成員,從中獲取信息等是有用的......

典型你想使用反射的例子是製作一個Java調試器。由於任何代碼都可以在調試器上運行,因此需要反射來獲取有關對象實例及其結構的信息並將其顯示給用戶。

1

當開發在JVM上運行的腳本語言的解釋器時,它可以很有用,它可以調用Java方法。

此外,可能在允許插件擴展的系統中很有用。

3

反射是使用它的一個原因。另一個很好的例子是在運行時動態構建對象。

例如,Spring framework使用包含Java類名稱的配置文件。在該代碼的某處,Spring需要構建這些類的對象實例。通過這種方式,創建對象時不需要編譯器在編譯時需要了解有關Java類的任何信息。

+0

這是有點過時了,現在你可以使用註釋,而不是XML配置,並保存所有樣板XML語法和時間寫下(以及時間以確保它寫得很好) – 2013-05-07 13:59:47

+0

*「反射是使用它的一個原因」*我不明白這個短語,'Class'是一個反射類,所以就像是說:「一個原因使用X是X本身「... – m0skit0 2013-05-07 14:08:45

1

另一種使用情況:

InputStream is = MyClass.class.getResourceAsStream("/some/resource/in/the/jar"); 
1

插件是這個大用處。

動態加載.class文件,這就是說,你的插件文件夾,並從所述文件執行某些指定的功能。然後,您可以一次爲應用程序安裝0個或更多插件及其組合。