一.反射的基本概念
反射(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("类的全路径");