1、什么是反射
反射说的是在运行状态中,对于任何一个类,我们都能够知道这个类有哪些方法和属性。对于任何一个对象,我们都能够对它的方法和属性进行调用。 简单来说,反射就是运行期识别类的能力,能解析出类的元数据。
2、Class类
Class类是反射机制的入口。
Class类的实例表示正在运行的Java 应用程序中的类和接口。也就是jvm中有N多的实例每个类都有该Class对象(包括基本数据类型)。Class类没有公共构造方法。注意在运行期间,一个类只有一个Class对象产生。
当类加载以后,jvm 便自动产生一个Cass对象,使用该对象就可以获取一个类中的方法、成员以及构造方法的声明和定义等信息。
3、实现反射的三种方式
1)object.getclass()方法,例如:
Student stu = new Student ();
Class stuclass = stu.getClass ();
System.out.println(stuclass);
因为Object 类中存在getClass( )方法,而所有类都继承了Object 类,所以可以调用Object类来获取。但这种方式下,对象都有了还要反射什么,所以几乎不用这种方式。
2)类名.class,例如:
Class stuclass = Student.class;
System.out.println(stuclass);
因为任何数据类型(包括基本数据类型)都有一个“静态"的class 属性,我们可以据此获得。但这种方式需要导入类的包,依赖太强,所以用的也不多。
3) Class. forName();方法,例如:
Class stuclass = Class.forName ("zjy.Student");
System.out.println(stuclass);
一般我们都使用这种方式,一个字符串可以传入也通过配置文件导入。
4、常用的Class类方法
public Constructor[] getConstructors() | 获取所有”公有的”构造方法 |
public Constructor[] getDeclaredConstructors() | 获取所有的构造方法(包括私有、受保护、默认、公有) |
public Constructor getConstructor(parameterTypes) | 获取单个的”公有的”构造方法 |
public Constructor getDeclaredConstructor(parameterTypes) | 获取"某个构造方法",可以是私有的,或受保护、默认、公有 |
public Field getField (String fieldName) | 获取单个的”公有的”成员交量 |
public Field getDeclaredField (String feldName) | 获取某个成员变量,可以是私有的,或受保护、默认、公有 |
public Method[] getMethods() | 获取所有”公有方法”(包含了父类的方法也包含Object类) |
public Method[] getDeclaredMethods() | 获取所有的成员方法,包括私有的(不包括继承的) |
public Method getMethod (String name, Class <?>---parameterTypes) | 获取单个的”公有的"成员方法 |
public Method getDeclaredMethod (String name, Class <?>---parameterTypes) | 获取某个成员方法,可以是私有的,或受保护、默认、公有 |
5、反射的主要功能
1)让java可以完成动态语言的部分功能;
2)可以实现一些特殊的功能,例如调用私有方法,属性;
3)获取某个对象的类型的元数据:(类,方法,雇性,构造方法);
4)获取某个类的父类(接口);
5)调用方法;
6)调用属性;
7)实例化对象;