学习笔记 | JAVA的反射(一)

在网上搜索,对JAVA反射的定义,是这样解释的:

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.

解读这一段话,什么是反射机制呢?就是说在运行时,对于任何一个类或对象,我们都能知道它所拥有的方法和属性,并使用它们。

这是怎么做到的呢?面向对象语言有一种说法:一切皆对象。即在JAVA中,我们把所有的东西都看作成对象,那所谓的“任意一个类”呢?它当然也是对象,打比方说,我们定义了一个新的类,名字叫做A,那这个A虽然是一个类,可以创建自己的对象,但是它自身也是一个对象(即java.lang.Class的实例对象)。

那如何表示这个实例对象呢?

按照以往的思路,我们创建一个对象时,可以这样 Student stu = new Student();,这个stu就是一个Student类的实例对象,而Class类的实例对象比较特殊,我们不能通过new来获取它,要如何获取Class的实例对象有三种方法:

Class c1 = stu.getClass(); | 所有的类都继承了Object类,通过使用Object的getClass()方法获得c1。

Class c2 = Student.class; | 使用静态的class属性获取c2。

Class c3 = Class.forName("xxx.xxx.Student); | 使用Class类的forName()方法获取c3。(常用)

Student这个类,它也是java.lang.Class的一个实例对象,怎么表示这个实例呢?我们就可以使用,c1,c2,c3来表示它,又因为c1,c2,c3所表示的都是Student这个类,所以说c1,c2,c3是完全相同的,也可以理解为每一个类,只有一个Class实例产生。

那好了,这样就获得了Class类的实例对象c1,也有人把它称作Student类的类类型,这个东西也就是前文概念中所描述的“该类的字节码文件对象”。之后,就可以使用这个c1调用Class类中内置的一些方法,来获取我们想知道的东西,即可以通过c1来获得Student类的方法和属性。

你可能感兴趣的:(学习笔记 | JAVA的反射(一))