Java反射

    Java語言容許經過程序化的方式間接對Class進行操做。Class文件由類裝載器裝載後,在JVM中將造成一份描述Class的對象,經過該對象能夠獲知Class的結構信息(構造方法,屬性,方法),並分別經過Java實例對這些信息進行描述。Java容許用戶經過這個Class相關的描述對象來間接調用類的功能。 java

  1. 類裝載器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()獲取類裝載器的父裝載器。

  2. 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");
相關文章
相關標籤/搜索