一.反射的基本概念
反射(Reflection
),Java 中的反射機制是指,Java 程序在運行期間可以獲取到一個對象的全部信息。
反射機制一般用來解決Java 程序運行期間,對某個實例對象一無所知的情況下,如何調用該對象內部的方法問題。
反射的原理:
反射機制允許 Java 程序在運行時調用Reflection API取得任何類的內部信息(比如成員變量、構造器、成員方法等),并能操作類的實例對象的屬性以及方法。
在Java 程序中,JVM 加載完一個類后,在堆內存中就會產生該類的一個 Class 對象,一個類在堆內存中最多只會有一個 Class 對象,這個Class 對象包含了該類的完整結構信息,我們通過這個 Class 對象便可以得到該類的完整結構信息。
這個 Class 對象就像是一面鏡子,我們透過這面鏡子可以清楚地看到類的結構信息。因此,我們形象的將獲取Class對象的過程稱為:反射。
二.反射的例子
package a.b.c.d;class Person {private String name;void setName(String name) { this.name = name; }String getName() { return this.name; }};public class Reflect {public static void main(String args[]) {Person p = new Person();Class<?> c1 = null;try {c1 = Class.forName("a.b.c.d.Person");} catch (ClassNotFoundException e) {System.out.println(e);}Class<?> c2 = p.getClass();Class<?> c3 = Person.class;System.out.println(c1.getName());System.out.println(c2.getName());System.out.println(c3.getName());}
}
運行:
root@ubuntu:/home/topeet/guyilian# mkdir -p a/b/c/d
root@ubuntu:/home/topeet/guyilian# ls
a Person.class Reflect.class Reflect.java
root@ubuntu:/home/topeet/guyilian# mv Reflect.java a/b/c/d
root@ubuntu:/home/topeet/guyilian# ls
a Person.class Reflect.class
root@ubuntu:/home/topeet/guyilian# javac a/b/c/d/Reflect.java
root@ubuntu:/home/topeet/guyilian# java a/b/c/d/Reflect
a.b.c.d.Person
a.b.c.d.Person
a.b.c.d.Person
三.反射API
①?調用某個類的對象的getClass()方法,即:對象.getClass();
Person p = new Person();
Class clazz = p.getClass();
②?調用類的class屬性類獲取該類對應的Class對象,即:類名.class
Class clazz = Person.class;
③?使用Class類中的forName()靜態方法(最安全,性能最好)即:Class.forName(“類的全路徑”)
Class clazz = Class.forName("類的全路徑");