Java語言容許經過程序化的方式間接對Class進行操做。Class文件由類裝載器裝載後,在JVM中將造成一份描述Class的對象,經過該對象能夠獲知Class的結構信息(構造方法,屬性,方法),並分別經過Java實例對這些信息進行描述。Java容許用戶經過這個Class相關的描述對象來間接調用類的功能。 java
類裝載器ClassLoader 編程
①ClassLoader工做機制 數組
類裝載器就是尋找類或接口字節碼文件進行解析並構造JVM內部對象表示的組件。 函數
在JVM中,類裝載器將一個類裝入JVM中,須要通過如下步驟 code
1)裝載:查找和導入Class文件 對象
2)連接:執行校驗、準備和解析步驟,解析步驟可選: 接口
a)校驗:檢查載入Class文件數據的正確性; get
b)準備:給類的靜態變量分配存儲空間; class
c)解析:將符號引用轉爲直接引用; 變量
3)初始化:對類的靜態變量,靜態代碼塊執行初始化工做。
②ClassLoader的重要方法
*Class loadClass(String name),有一個重載方法Class loadClass(String name, boolean resolve)是否須要解析。
*Class defineClass(String name, byte[] b, int off, int len)將類文件的byte數字轉換爲JVM內部的java.lang.Class對象。
*Class findSystemClass(String name)
*Class findLoadedClass(String name)
*ClassLoader getParent()獲取類裝載器的父裝載器。
Java反射機制
Class反射對象描述類與一結構,能夠從Class對象中獲取構造方法、成員變量、方法類等類元素的反射對象,並以編程的方式經過這些反射對象對目標類對象進行操做
①反射類
*Constructor:類的構造函數反射類。經過Class#getConstructors()方法能夠獲取類的全部構造函數反射對象數組。Class#getConstructor(Class...param)來獲取特定入參的構造函數。Constructor的主要方法爲newInstance(Object [] param)來建立類的實例。
*Method:類方法的反射類,經過Class#getDeclaredMethods()能夠獲取類的全部方法反射類對象數組。還能夠經過Class#getDeclaredMethods(String methodName, Class...parameter)獲取特定的方法。Method主要的方法爲invoke(Object target, Object[] params)
*Field:類的成員變量的反射對象,經過Class#getDeclareFields()獲取全部,經過Class#getDeclareField(String name)獲取特定。主要方法爲set(Object obj, Object value)
ClassLoader loader = Thread.currentThread().getContextClassLoader(); Class clazz = loader.loadClass("com.gy.Car"); Constructor cons = clazz.getDeclaredConstructor((Class[])null); Car car = (Car)cons.newInstance(); Method setBrand = clazz.getDeclaredMethod("setBrand", String.class); setBrand.invoke(car, "audi"); Field color = clazz.getDeclaredField("color"); color.setAccessible(true); color.set(car, "red");