反射概述
Java反射機制指的是在程序的運行過程中,對於任何一個類,都能夠知道它的所有屬性和方法。對於任意一個對象,都能夠調用它的任意屬性和方法,這種動態獲取信息以及動態調用對象方法的功能稱為Java語言的反射機制。
反射常用類
- Class:
Class
類的實例表示正在運行的Java
應用程序中的類和接口。 - Constructor:關於類的單個構造方法的信息以及對它的權限訪問。
- Field:Field 提供有關類或接口的單個字段的信息,以及對它的動態訪問權限。
- Method:Method 提供關於類或接口上單獨某個方法的信息。
獲取Class對象的方法
獲取Class對象的的方法有以下幾種:
類名.class
Class<Person> clazz = Person.class;
對象.getClass()
Person p1 = new Person();
Class clazz2 = p1.getClass();
Class.forName(全限定類名)
Class clazz3 = Class.forName("com.emhum.demo.Person");
- 使用類的加載器,ClassLoader(這種方式了解即可)
ClassLoader classLoader = PersonTest.class.getClassLoader();
Class clazz4 = classLoader.loadClass("com.emhum.demo.Person");
反射示例
定義Person類:
public class Person {
private String name;
public int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
private Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public void show() {
System.out.println("你好啊!");
}
public String showAddress(String address) {
System.out.println("我的地址是:" + address);
return address;
}
}
測試獲取Person類的部分結構信息:
public class PersonTest {
//使用反射,對Person進行操作
@Test
public static void test1() throws Exception {
Class<Person> clazz = Person.class;
//通過反射,創建Person類的對象
Constructor<Person> cons = clazz.getConstructor(String.class, int.class);
/**
* newInstance():調用此方法,創建對應的運行時類的對象。
* 1.運行時類必須提供空參的構造器
* 2.空參的構造器的訪問權限通常設置為public
*/
Person p = cons.newInstance("tom", 12);
System.out.println(p.toString());
//通過反射,調用對象指定的屬性和方法
//調用屬性
Field age = clazz.getDeclaredField("age");
age.set(p, 10);
System.out.println(p.toString());
//調用方法
Method show = clazz.getDeclaredMethod("show");
show.invoke(p);
//通過反射,可以調用Person類的私有結構,比如:私有構造器,私有方法,私有屬性。
//調用私有構造器
Constructor<Person> cons1 = clazz.getDeclaredConstructor(String.class);
//保證此構造器是可訪問的
cons1.setAccessible(true);
Person p1 = cons1.newInstance("jerry");
System.out.println(p1);
//調用私有的屬性
Field name = clazz.getDeclaredField("name");
name.setAccessible(true);
name.set(p1, "tomas");
System.out.println(p1);
//調用私有的方法
Method showAddress = clazz.getDeclaredMethod("showAddress", String.class);
showAddress.setAccessible(true);
showAddress.invoke(p1, "上海");
}
}