什么是反射机制?
Java 动态执行机制,可以动态执行功能
- 反射是java的一个高级API,其提供了在运行时判断任意一个对象所属的类型,并可以检查解析的内部结构
- 反射可以动态加载类型,并能够创建对象
- 反射可以动态访问对象的属性
- 反射可以动态执行对象的方法
- 利用反射的API还可以动态的访问不可见的属性和方法
反射的优缺点
优点:
可以动态执行!在运行期间根据业务功能动态执行方法,访问属性,最大发挥了java的灵活度
缺点:
对性能有影响,反射的运行慢于直接执行java代码
获取一个类的类对象有以下方式:
1:类名.class
例如:
Class cls = String.class;
Class cls = int.class;
注:基本类型只有这种获取类对象的方式
2:Class.forName(String className)
例如:
Class cls = Class.forName(“java.lang.String”);
注意:参数是类的完全限定名,即:包名.类名
3:使用类加载器ClassLoader
Java 反射API位于java.lang.reflect包中,主要包括以下几类:
—Constructor类:用来描述一个类的构造方法。
—Field类:用来描述一个类的方法
—Method:类用来描述类内各元素的修饰符
—Array:用来对数组进行操作
Class cls = Class.forName(类名)
1.类名是运行期间动态输入的类名,可以任何类名
2.返回值是一个引用,利用这个引用指向的对象可以访问方法区中的类信息。
3.如果类名是错误的将出现“类没有找到”的异常
如果利用反射API调用了没有可访问权限时候会抛出异常
IllegalAccessException ,表示没有访问权限。
但是在Method方法上提供了解除访问限制的方法:
setAccessible(boolean flag):此方法可以调用其他类私有的方法
在invoke之前使用这个方法可以解除访问限制,实现访问没有权限的方法。
注意:这个功能破坏了面向对象原有的封装行,因此在使用时谨慎使用,灵活运用
哪里用到了反射?
- JDBC中利用反射动态加载了数据库驱动程序
- Web服务器中利用反射调用了Sevlet的服务方法
- Eclispe等开发工具中利用反射动态刨析对象的类型与结构,动态提示对象的属性和方法
- 很多框架都用到了反射机制,注入属性,调用方法,如:Hibernate,Struts2,Spring