一.反射的基本概念

反射(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/droot@ubuntu:/home/topeet/guyilian# lsaPerson.classReflect.classReflect.javaroot@ubuntu:/home/topeet/guyilian# mv Reflect.java a/b/c/droot@ubuntu:/home/topeet/guyilian# lsaPerson.classReflect.classroot@ubuntu:/home/topeet/guyilian# javac a/b/c/d/Reflect.java root@ubuntu:/home/topeet/guyilian# java a/b/c/d/Reflecta.b.c.d.Persona.b.c.d.Persona.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("类的全路径");