反射机制指的是Java在运行时候有一种自观的能力,能够了解自身的情况为下一步做准备,其想表达的意思就是:在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性(包括私有的方法和属性),这种动态获取的信息以及动态调用对象的方法的功能就称为java语言的反射机制。通俗点讲,通过反射,该类对我们来说是完全透明的,想要获取任何东西都可以,这是一种动态获取类的信息以及动态调用对象方法的能力。
想要使用反射机制,就必须要先获取到该类的字节码文件对象(.class),通过该类的字节码对象,就能够通过该类中的方法获取到我们想要的所有信息(方法,属性,类名,父类名,实现的所有接口等等),每一个类对应着一个字节码文件也就对应着一个Class类型的对象,也就是字节码文件对象。
Java提供的反射机制,依赖于我们下面要讲到的Class类和java.lang.reflect类库。我们下面要学习使用的主要类有:①Class表示类或者接口;②java.lang.reflect.Field表示类中的成员变量;③java.lang.reflect.Method表示类中的方法;④java.lang.reflect.Constructor表示类的构造方法;⑤Array提供动态数组的创建和访问数组的静态方法。
二、反射之Class类 (1)初识Class类在类Object下面提供了一个方法:
①Class也是类的一种(不同于class,class是一个关键字);
②Class类只有一个私有的构造函数
③对于同一类的对象,在JVM中只存在唯一一个对应的Class类实例来描述其信息;
④每个类的实例都会记得自己是由哪个Class实例所生成;
⑤通过Class可以完整的得到一个类中的完整结构;
(3)获取Class类实例刚刚说到过Class只有一个私有的构造函数,所以我们不能通过new创建Class实例 ,有下面这几种获取Class实例的方法:
①Class.forName("类的全限定名"),该方法只能获取引用类型的类类型对象。该方法会抛出异常(a.l类加载器在类路径中没有找到该类 b.该类被某个类加载器加载到JVM内存中,另外一个类加载器有尝试从同一个包中加载)
1 //Class<T> clazz = Class.forName("类的全限定名");这是通过Class类中的静态方法forName直接获取一个Class的对象 2 Class<?> clazz1 = null; 3 try { 4 clazz1 = Class.forName("reflect.Person"); 5 } catch (ClassNotFoundException e) { 6 e.printStackTrace(); 7 } 8 System.out.println(clazz1); //class reflect.Person

