反射概述
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);
}
}