2020-07-23反射、獲得構造方法

反射概述

java反射機制:是指在運行時去獲取一個類的變量和方法信息。然后通過獲取到的信息來創(chuàng)建對象,調用方法的一種機制。由于這種動態(tài)性,可以極大的增強程序的靈活性,程序不用在編譯器就完成確定,在運行期間仍然可以擴展

獲取Class類的對象

我們要想通過反射去使用一個類,首先我們要獲取該類的字節(jié)碼文件對象,也就是類型為Class類型的對象,提供三種方式獲取Class類型的對象
①使用類的class屬性來獲取該類對應的Class對象。舉例:Student.class將會返回Student類對應的class對象
②調用對象的getClass()方法,返回該對象所屬類對應的Class 對象。(該方法是Object類中的方法,所有的Java對象都可以調用該方法)
③使用Class類中的靜態(tài)方法forName(String className),該方法需要傳入字符串參數(shù),該i字符串參數(shù)是某類的全路徑,也就是包含包名的路徑。

public class Demo {
    public static void main(String[] args) throws ClassNotFoundException {
        Class<Student> studentClass = Student.class;
        System.out.println(studentClass);
        Class<Student> studentClass1 = Student.class;
        System.out.println(studentClass==studentClass1);
        System.out.println("---------------------");
        Student student = new Student();
        Class<? extends Student> aClass = student.getClass();
        System.out.println(aClass);
        System.out.println(aClass==studentClass);
        System.out.println("---------------------");
        Class<?> aClass1 = Class.forName("com.Student");
        System.out.println(aClass1);
        System.out.println(aClass1==studentClass);
    }
}

反射獲取構造方法并使用

  • 方法
方法 說明
getConstructors() 返回一個包含Constructor對象的數(shù)組,Constructor對象反應了由該class對象表示的類的所有公共構造函數(shù)
getDeclaredConstructor() 返回Class對象表示的類聲明的所有構造函數(shù)
getConstructor(Class<?>... parameterTypes) 返回一個Constructor對象,該對象反映Constructor對象表示的類的指定的公共構造函數(shù)
getDeclaredConstructor(Class<?>... parameterTypes) 返回一個 Constructor對象,該對象反映 Constructor對象表示的類或接口的指定構造函數(shù)。

獲取指定構造函數(shù)方法的參數(shù)是要獲取的構造方法的參數(shù)的個數(shù)和數(shù)據(jù)類型對應的字節(jié)碼文件

public class Demo {
    public static void main(String[] args) throws NoSuchMethodException {
        Class<Student> studentClass = Student.class;
        //獲得公共構造函數(shù)
        Constructor<?>[] constructors = studentClass.getConstructors();
        for (Constructor con : constructors) {
            System.out.println(con);
        }
        System.out.println("______________________");
        //獲取所有構造函數(shù)
        Constructor<?>[] declaredConstructors = studentClass.getDeclaredConstructors();
        for (Constructor con : declaredConstructors) {
            System.out.println(con);
        }
        System.out.println("______________________");
        //獲取指定公共構造函數(shù)
        Constructor<Student> constructor = studentClass.getConstructor(String.class, int.class, String.class);
        System.out.println(constructor);
        //獲取指定構造函數(shù)
        Constructor<Student> declaredConstructor = studentClass.getDeclaredConstructor(String.class);
        System.out.println(declaredConstructor);
    }
}

通過得到的構造方法對象實例化對象

方法 說明
newInstance() 使用此Constructor對象表示的構造函數(shù),使用指定的初始化參數(shù)來創(chuàng)建和初始化構造函數(shù)的聲明類的新實例
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class Demo {
    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Class<Student> studentClass = Student.class;
        //獲取指定構造函數(shù)
        Constructor<Student> declaredConstructor = studentClass.getDeclaredConstructor(String.class, int.class, String.class);
        Student zzt = declaredConstructor.newInstance("zzt",24,"山東東營");
        System.out.println(zzt);
    } 
}
方法 說明
setAccessible(boolean flag) 值為true時,取消訪問檢查(private修飾的構造方法可以使用)
public class Demo {
    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Class<Student> studentClass = Student.class;
        //獲取指定構造函數(shù)
        Constructor<Student> declaredConstructor = studentClass.getDeclaredConstructor(String.class);
        declaredConstructor.setAccessible(true);
        Student zzt = declaredConstructor.newInstance("zzt");
        System.out.println(zzt);
    }
}
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容