一、概述
1、介绍
Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。
加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象就包含了完整的类的结构信息。可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子可以看到类的结构,所以,形象的称之为:反射。
2、动态语言与静态语言
动态语言:是一类在运行时可以改变其结构的语言。例如,新的函数、对象,甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。通俗点说就是在运行时代码可以根据某些条件改变自身结构。主要动态语言:Object-C、C#、JavaScript、PHP、Python、Erlang。
静态语言:与动态语言相对应的,运行时结构不可变的语言就是静态语言。如Java、C、C++。
Java不是动态语言,但Java可以称之为"准动态语言"。即Java有一定的动态性,可以利用反射机制、字节码操作获得类似动态语言的特性。Java的动态性让编程更加灵活!
3、Java反射的功能
(1)在运行时判断任意一个对象所属的类。
(2)在运行时构造任意一个类的对象。
(3)在运行时判断任意一个类所具有的成员变量和方法。
(4)在运行时获取泛型信息。
(5)在运行时调用任意一个对象的成员变量和方法。
(6)在运行时处理注解。
(7)生成动态代理。
4、相关API
代码示例:类的实例化
1 class Person { 2 private String name; 3 public int age; 4 public void say() { 5 System.out.println("say hello"); 6 } 7 8 private String eat(String food) { 9 System.out.println("我正在吃:" + food); 10 return food; 11 } 12 // getter && setter 13 // 有参、无参构造器 14 } 15 16 // 未使用反射 17 public class Main { 18 public static void main(String[] args) { 19 // 1.创建类的对象 20 Person person = new Person("Tom", 18); 21 // 2.通过对象,调用属性及方法 22 person.age = 10; 23 System.out.println(person.toString()); 24 25 person.say(); 26 // 3.不可以通过对象调用私有结构 27 // person.name = ""; 28 // person.eat(); 29 } 30 } 31 32 // 使用反射 33 public class Main { 34 public static void main(String[] args) throws Exception { 35 // 1.创建类的对象 36 Class<Person> clazz = Person.class; 37 // 获取类的构造器 38 Constructor<Person> constructor = clazz.getConstructor(String.class, int.class); 39 Person person = constructor.newInstance("Tom", 12); 40 System.out.println(person.toString()); 41 42 // 2.通过反射,调用属性及方法 43 Field age = clazz.getDeclaredField("age"); 44 age.set(person, 10); 45 System.out.println(person.toString()); 46 47 Method show = clazz.getDeclaredMethod("say"); 48 show.invoke(person); 49 } 50 }
02-10 22:36