一、什么叫Java反射机制?
Java中的反射机制是指在运行状态中,对于任意一个类,能够动态获取这个类中的属性和方法;对于任意一个对象,都能够任意调用它的属性和方法。这种动态获取类的信息以及动态调用对象方法的功能称为Java的反射机制。总结就是:反射可以实现运行时知道任意一个类的属性和方法。
二、Java当中为什么需要反射机制?工作原理是什么?
要明白为什么需要反射机制,首先就得先清楚两个概念:
(1)静态编译:在编译时就必须要知道变量得类型才能编译通过,比如C++,Java等编译之前必须清楚的指明数据类型;
(2)动态编译:显然和上述概念相反,即在编译时不需要立即知道变量的类型,在运行时指明其类型就行。
有上述概念之后便有了静态语言和动态语言之分,而Java,C++就是典型的静态语言,而Python,Ruby等则为动态语言。但是Java虽是一个静态的解释型语言,但其也有动态的性质------反射(Reflection)。用在Java身上指的是运行时加载,探知,使用编译期间未知的classes。
下面探讨一下反射是如何在仅知道类名的情况下能够知道整个类的完整构造的(方法,属性等)。
首先我们都清楚,Java是一种解释型的语言,即编译器首先将源码编译成class文件,然后虚拟机(JVM)再将class文件解释给目标计算机执行。而这里所说的反射机制操作的其实就是源码编译之后的class文件。首先将class文件加载到内存,然后从该文件中解剖出某个具体类的构造函数,方法和属性,从而完全知道某个类的所有构造。
三、反射的使用及入门
在使用反射之前,最好清楚一个这样的概念,即类类型。在编程语言中,各种数据都有其数据类型,那么对于类本身而言,它也有自己的类型,即类类型,其实和普通的数据类型差不多,清楚这一点就行。类是java.lang.Class类的实例对象,而Class是所有类的类(There is a class named Class)。对于普通的类实例化时只需要new一个就行,但是要想用new实例化Class是行不通的,因为Class的构造器是私有的(自行查看源码)。
1、获取某个类(Student)的Class对象的三种方法:
(1)Class c1=Student.class;//通过Student类隐藏的静态变量来获取
(2)Class c2=Student.getClass();//通过Stduent的getClass()方法
(3)Class c3=Student.forName("com.tyf.reflect.Student");//com.tyf.reflect.Student为Student类的全类名。
注意:这里的c1,c2,c3是完全一样的,都是Class的对象(学名 类类型)。这里不必纠结Student和c1,c2,c3是否一样了(都叫Class对象),只需了解类类型是什么就行。