一、概述

1、介绍

  Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。
  加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象就包含了完整的类的结构信息。可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子可以看到类的结构,所以,形象的称之为:反射。

Java基础(十一)——反射-LMLPHP

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