一、反射API的作用
用来生成在当前JAVA虚拟机中的类、接口或者对象信息。
二、常用的反射类:
Class类:是反射的核心类,反射所有的曹组都是围绕该类生成的,他可以获取类的属性、方法等内容信息;
Field类:表示类的属性,他可以获取和设置类中属性的值;
Method类:表示类的方法,他可以用来获取类中方法的信息,或者执行方法;
Construct类:表示类的构造方法。
三、java反射API的应用:
1、 利用反射获取指定类的方法、属性。
例如,eclipse环境中,输入对象名。,自动罗列出对象的全部方法。
四、使用java反射机制的步骤:
导入java.lang.reflect包
1、获得想要操作的类的java.lang.Class对象;
2、调用Class类的诸如get***Methods这样的方法,以便得到对象的方法和属性;
3、使用反射API来操作这些信息;
我们知道,每隔类被加载后,系统就会为该类生成一个对应的Class对象,通过该Class对象就可以访问到java虚拟机中的这个类。
获取Class对象的方式,有以下三种:
A、调用某个对象的getClass()方法
Person p=new Person();
Class cla = p.getClass();
因为getClass方法是java.lang.Object类中的一个方法,所以所有的java对象都可以调用该方法,返回该对象所属类对应的Class对象。
特点:不需要指定类的全路径;但是必须有一个前提——申请一个类的对象,然后调用这个对象的getClass方法来获得class对象。
缺点:如果只定义了一个接口,但是并不知道他的实现类,因为接口不能初始化,就谈不上他的对象了,此时getClass()方法无能为力。
B、调用某个类的class属性来获取该类对应的Class对象
Claas cla= Person.class;
特点:
这种方式,需要在编译期就知道类的名字;
这种方式,代码更安全(因为程序在编译的时候就可以检查对象是否存在)、程序性能更高(无需调用方法)
C、使用Class类的forName()静态方法
Class cla= Class.forName("com.pb.jadv.reflcetion.Person");
这种方式,需要传入某个类的全名的字符串参数,否则会抛出异常。
五、从Class类中获取信息
get****####方法,如果有Declared字样,则可返回所有的方法或属性。如果没有,则只返回public方法或属性。
总的来说,只有程序需要动态创建某个类的对象时,才会考虑使用反射,通常在开发通用性比较广的框架基础平台时可能会大量使用反射。
在很多java EE框架中都需要根据配置文件信息来创建java对象。从配置文件中读取的只是某个类的字符串类名,程序想根据字符串来创建对应的实例,就必须使用反射。
Spring框架就应用了反射技术。