【黑马程序员】反射机制

来源:互联网 发布:八极拳小说知乎 编辑:程序博客网 时间:2024/06/05 17:17

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------


视频中老师定义的反射概念:反射就是将java的各个成文映射成对应的java类。

对于这句话,我的理解是:一个类通过反射,可以将这个类本身作为一个类的对象。通过这个对象可以获得这个类的构造器、类中的属性、类中的方法,举个例子,有一个person类,里面有获得姓名和年龄的方法,就可以通过 getName和getAge方法获得姓名和年龄,而通过反射可以获得person这个类的类对象,通过类对象就可以有其中的方法,例如:

Class clazz = Person.class;

Methodmethod = clazz.getMethod(“getName”,参数值);

method.invoke(); 通过这个方法就可以获得person类中的getName方法,并应用。


反射的好处:大大的增强了程序的扩展性。

反射的具体实现:

一、反射的基本步骤:

1、获得Class对象,就是获取到指定的名称的字节码文件对象。

2、实例化对象,获得类的属性、方法或构造函数。

3、访问属性、调用方法、调用构造函数创建对象。


二、获取这个Class对象,有三种方式:

1:通过每个对象都具备的方法getClass来获取。弊端:必须要创建该类对象,才可以调用getClass方法。

2:每一个数据类型(基本数据类型和引用数据类型)都有一个静态的属性class。弊端:必须要先明确该类。

 前两种方式不利于程序的扩展,因为都需要在程序使用具体的类来完成。

3:使用的Class类中的方法,静态的forName方法

 指定什么类名,就获取什么类字节码文件对象,这种方式的扩展性最强,只要将类名的字符串传入即可。


反射的用法总结:

1)、需要获得java类的各个组成部分,首先需要获得类的Class对象,获得Class对象的三种方式:

Class.forName(classname) 用于做类加载

obj.getClass() 用于获得对象的类型

类名.class     用于获得指定的类型,传参用

2)、反射类的成员方法:

Class clazz = Person.class;

Method method = clazz.getMethod(methodName,new Class[]{paramClazz1, paramClazz2});

method.invoke();

3)、反射类的构造函数:

Constructor constructor = clazz.getConstructor(newClass[]{paramClazz1, paramClazz2,...})

constructor .newInstance(params...)

4)、反射类的属性:

Field field = clazz.getField(fieldName);

field.setAccessible(true); //暴力获取,可以访问private类型的属性

field.setObject(value);

获取了字节码文件对象后,最终都需要创建指定类的对象:

创建对象的两种方式(其实就是对象在进行实例化时的初始化方式):

1,调用空参数的构造函数:使用了Class类中的newInstance()方法。

2,调用带参数的构造函数:先要获取指定参数列表的构造函数对象,然后通过该构造函数的对象的newInstance(实际参数) 进行对象的初始化。

综上所述,第二种方式,必须要先明确具体的构造函数的参数类型,不便于扩展。所以一般情况下,被反射的类,内部通常都会提供一个公有的空参数的构造函数。