天天看點

面試官,簡單講講Java的反射

一、什麼是反射?

Java執行個體運作中擷取自身的Class資訊,操作一個類的任意field和method(甚至private修飾的)。

二、如何擷取Class對象

方式 作用 應用場景 Class.forName("全限定名") 通過指定的字元串路徑 多用于配置檔案,将類名定義在配置檔案中 類名.class 通過類名的屬性class 多用于參數的傳遞 對象.getClass() 通過對象的getClass() 對象擷取位元組碼

三、基本使用

3.1建立對象

// 無參構造函數
public class GetClassConstructorDemo1 {
    public static void main(String[] args) throws Exception {
        //擷取類的構造方法對象,并通過運作構造方法擷取對象
        Class<?> c1 = Class.forName("com.abc.clazz.Student");
        //擷取無參數構造
        Constructor<?> constructor = c1.getConstructor();
        //運作構造方法,建立對象
        Object obj = constructor.newInstance();
        Student s = (Student) obj;
        System.out.println("s = " + s);//Student{name='null', age=0}
    }
}

// 有參構造函數
public class GetClassConstructorDemo2 {
    public static void main(String[] args) throws Exception {
        //擷取類的構造方法對象,并通過運作構造方法擷取對象
        Class<?> c1 = Class.forName("com.abc.clazz.Student");
        //擷取有參數構造方法
        Constructor<?> c2 = c1.getConstructor(String.class, int.class);
        Object o2 = c2.newInstance("Mark", 12);
        Student s2 = (Student) o2;
        System.out.println("s2 = " + s2);//Student{name='Mark', age=12}
    }
}

// 最簡單的方式
public class GetClassConstructorDemo3 {
    public static void main(String[] args) throws Exception {
        //擷取類的構造方法對象,并通過運作構造方法擷取對象
        Class<?> c1 = Class.forName("com.abc.clazz.Student");
        Object o3 = c1.newInstance();
        Student s3 = (Student) o3;
        System.out.println("s3 = " + s3);//Student{name='null', age=0}
    }
}
           

3.2執行成員方法

Class類中與Method相關方法

1. Method[] getMethods()
    擷取所有的public修飾的成員方法,包括父類中。
2. Method getMethod("方法名", 方法的參數類型... 類型) 
    根據方法名和參數類型獲得一個方法對象,隻能是擷取public修飾的  
           

Method類中關鍵方法

Object invoke(Object obj, Object... args) 
    傳回值Object,表示調用方法後,該方法的傳回值
    根據參數args調用對象obj的該成員方法  
    如果obj=null,則表示該方法是靜态方法
           
// 反射擷取無參方法,并執行
public class GetClassMethodDemo1 {
    public static void main(String[] args) throws Exception {
        //反射擷取目标類的位元組碼對象,并執行其成員方法
        Class<?> c1 = Class.forName("com.abc.clazz.Student");
        Object obj = c1.newInstance();

        //反射擷取無參數方法:Student的study方法
        Method studyMethod = c1.getMethod("study");
        //執行study方法
        studyMethod.invoke(obj);
    }
}

// 反射擷取有參方法,并執行
public class GetClassMethodDemo2 {
    public static void main(String[] args) throws Exception {
        //反射擷取目标類的位元組碼對象,并執行其成員方法
        Class<?> c1 = Class.forName("com.abc.clazz.Student");
        Object obj = c1.newInstance();

        //反射擷取有參數方法:Student的eat方法
        Method eatMethod = c1.getMethod("eat", String.class, double.class);
        //調用eat方法,傳遞實際參數
        eatMethod.invoke(obj, "蕃茄炒雞蛋", 9.9);
    }
}
           

小結

另外,如果對并發程式設計或者面試,想要了解更多請持續關注微信公衆号:Java面試教程,關注更多有用的面試要點與技巧。

了解更多Java相關資料,請關注微信公衆号:Java面試教程

回複: bbb20,擷取更多Java資料與面試手冊

回複: bbb19,擷取Intellij idea最新版激活教程

讓我們一起,玩轉Java面試

Java反射功能雖小,意義重大,它是各種容器實作的核心。是以,了解架構的底層機制有助于豐富自己的程式設計思維。