查看API幫助文檔的Object 能夠看到有這樣一個方法getClass() (這是Object 類的方法) 解釋是返回運行時的對象的class對象java
HelloWorld.class 也就是 Class<HelloWorld> (API中解釋爲 T - the type of the class modeled by this Class object. For example, the type of String.class is Class<String> . Use Class<?> if the class being modeled is unknown ) Class<T>中的T有有點像C++中的template<class T> Class<?> 也就是 Class<? extends Object>sql
?的意思的,因爲可能暫時不知道對象的Class類型(或爲了簡單用?替代) ,由於每一個Class<T> 又繼承Object ,因此能夠表明任意的類型數組
類型安全 Class Class<T> Class<?>安全
Colleciton<Object> c List<Object> List<?> List<T> List網絡
在Java集合框架中,對於參數值是未知類型的容器類,只能讀取其中元素,不能向其中添加元素, 由於,其類型是未知,因此編譯器沒法識別添加元素的類型和容器的類型是否兼容,惟一的例外是NULL數據結構
關於getGenericSuperclass等等的解釋,請參考http://blog.csdn.net/gengv/article/details/5178055框架
Type type = ((ParameterizedType)foo.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
三,class的主要方法函數
class類的方法仍是挺多的。主要是用於獲得運行時類的相關信息(可用於反射)。this
1, public static Class<?> forName(String className) :natice 方法,動態加載類。很是重要。 如在sql中動態加載驅動程序:class.forName(sqlDriver);.net
2,public T newInstance() :根據對象的class新建一個對象,用於反射。很是重要。 可用在反射中構建對象,調用對象方法:
class doubleClass= class.forName("java.lang.Double"); Object objDouble = doubleClass.newInstance(); 如在javaBean中就應用了這個方法,由於java默認要有一個無參構造函數。
3, public ClassLoader getClassLoader() :得到類的類加載器Bootstrap ,Extension ,System or user custom ClassLoader(通常爲system classloader)。重要。
5,public native Class getSuperclass():獲取類的父類,繼承了父類則返回父類,不然返回java.lang.Object。返回Object的父類爲空-null。通常
7,其餘類
public boolean isEnum() :判斷是否爲枚舉類型。
public native boolean isArray() :判斷是否爲數組類型。
public native boolean isPrimitive() :判斷是否爲基本類型。 public boolean isAnnotation() :判斷是否爲註解類型。
public Package getPackage() :反射中得到package,如java.lang.Object 的package爲java.lang。
public native int getModifiers() : 反射中得到修飾符,如public static void等 。
public Field getField(String name):反射中得到域成員。
public Field[] getFields() :得到域數組成員。
public Method[] getMethods() :得到方法。
public Method getDeclaredMethod(String name, Class<?>... parameterTypes):加個Declared表明本類,繼承,父類均不包括。
public Constructor<?>[] getConstructors() :得到全部的構造函數。
class文件 Class 類對象 類實例
class生死大綱 類加載的時機 類加載過程 驗證 準備 解析 初始化 使用 卸載
類加載過程: 加載:
1.經過一個類的全限定名來獲取定義此類的二進制字節流。這裏能夠是本地的或者網絡的均可以。
2.將這個字節流所表明的靜態存儲結構轉化爲方法區的運行時數據結構
3.在java堆中生成表明這個類的java.lang.Class對象,做爲方法區這些數據的訪問入口。