是什么?
任何一个都可以...
任何一个都可以...
为什么?
java从源码到运行经历三个阶段:Source/Class/Runtime
反射是工作在Runtime
重点在于,如果在Source有部分信息是不清晰的,需要在Runtime阶段动态临时加载,反射就可以派上用场。
->不需要知道类名就可以获取类对象
->可以修改和使用private属性和方法
怎么做?
->class : .class getClass forName
->constructor :
getConstructors()/getConstructors("int.class","String.class")
(类型)gtc.newInstance
->field : getDeclaredField("属性名")/field.setAccessible(true);
->method: getDeclaredMethod("int.class")//参数类型
method.invoke
应用场景?
1.JDBC 的数据库的连接
在JDBC 的操作中,如果要想进行数据库的连接,则必须按照以上的几步完成
通过Class.forName()加载数据库的驱动程序 (通过反射加载,前提是引入相关了Jar包)
通过 DriverManager 类进行数据库的连接,连接的时候要输入数据库的连接地址、用户名、密码
通过Connection 接口接收连接
2.在 Java的反射机制在做基础框架的时候非常有用,行内有一句这样的老话:反射机制是Java框架的基石。
一般应用层面很少用,不过这种东西,现在很多开源框架基本都已经封装好了,自己基本用不着写。
典型的除了hibernate之外,还有spring也用到很多反射机制。最经典的就是xml的配置模式。
Spring 通过 XML 配置模式装载 Bean 的过程:
将程序内所有 XML 或 Properties 配置文件加载入内存中
Java类里面解析xml或properties里面的内容,得到对应实体类的字节码字符串以及相关的属性信息
使用反射机制,根据这个字符串获得某个类的Class实例
动态配置实例的属性
Spring这样做的好处是:
不用每一次都要在代码里面去new或者做其他的事情
以后要改的话直接改配置文件,代码维护起来就很方便了
有时为了适应某些需求,Java类里面不一定能直接调用另外的方法,可以通过反射机制来实现