反射的定義
Java本身屬于靜態(tài)語言,但是有著一個非常突出的動態(tài)機制;反射象迎,即在程序運行時加載、探知呛踊、使用編譯期間完全未知的classes砾淌。從class對象中獲取構造函數(shù)、成員變量谭网、方法汪厨、類等元素的反射對象,并通過這些對象對目標類對象進行操作蜻底。
反射所需的類
Class類:所在位置 java.lang.Class<T> 不提供public構造方法骄崩,由JVM通過調用類加載器的defineClass方法自動構造
Constructor類:所在位置 java.lang.reflect.Constructor<T> T-在其中聲明構造方法的類
Method類:類或接口上單獨某個方法的信息聘鳞,所反映的方法可能是某類方法或實例方法(包括抽象方法)
Field類:提供有關類或接口的單個字段的信息,以及對它的動態(tài)訪問權限。
反射API
使用反射API獲取當前Java虛擬機中的類要拂、接口抠璃、成員變量、方法等信息脱惰。
類:
java.lang.Class#public static Class<?> forName(String className) throws ClassNotFoundException
構造器:
java.lang.Class#public Constructor<T> getConstructor(Class<?> ... parmeterTypes) throws NosuchMethod Exception, SecurityException
java.lang.Class#public Contructor<T> getDeclareConstructor(Class<?>... paramterTypes) throws NosuchException, SecurityException
成員變量
java.lang.Class#public Field getField(String name) throws NoshFieldException, SecurityException
java.lang.Class#public Field getDeclaredField(String name) throws NoshFieldException, SecurityException
簡單舉例
//這是一個簡單的模型對象
public class User {
private String name;
private int age;
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 "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class UserReflect {
public static void main(String[] args) {
//1. 正常情況 使用new關鍵字
User user = new User();
System.out.println(user);
}
}
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
//使用反射搏嗡。 Class.forName(全限定名);
Class<?> clazz = Class.forName("User");
User user = (User) clazz.newInstance();
System.out.println(user);
}
反射威力強大,只要稍微理解一下拉一,很容易掌握采盒。網(wǎng)上的例子也實在是很多了,沒有必要重復舉這么多例子蔚润。