反射
概述
- JAVA反射机制是在运行状态中,对于任意一个类,都能够知道
这个类的所有属性和方法;对于任意一个对象,都能够调用它的
任意一个方法和属性;这种动态获取的信息以及动态调用对象的
方法的功能称为java语言的反射机制。 - 要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖
使用的就是Class类中的方法.所以先要获取到每一个字节码文件
对应的Class类型的对象.
可以简单的理解:
比如有一个妃子A和B,妃子B为了争宠要谋害A,她就扎一个A的小人。每天扎小人,对小人造成的伤害都会直接伤害到妃子A。
获取class类的三种方式
①Class.forName(“类的全限定名”):通过类的全限定名获取该类的 Class 对象(推荐)
常用,只需要传入一个类的完全限定名即可
Class<?> hashMap= Class.forName("java.util.HashMap");
②类名.class:这种获取方式只有在编译前已经声明了该类的类型才能获取到 Class 对象
需要导入对应的包,依赖太强
Class<HashMap> hashMap= HashMap.class;
③实例.getClass():通过实例化对象获取该实例的 Class 对象(不推荐)
已经创建对象,就意味着已经产生了Class类
<String, String> hashMap = new HashMap<>();
Class<? extends Map> hashMapClass = hashMap.getClass();
通过class对象获取类的所有信息
对应的一些API自己去Google一下就行了。
反射的应用场景
1、Spring 实例化对象:当程序启动时,Spring 会读取配置文件applicationContext.xml并解析出里面所有的标签实例化到IOC容器中。
2、反射 + 工厂模式:通过反射消除工厂中的多个分支,如果需要生产新的类,无需关注工厂类,工厂类可以应对各种新增的类,反射可以使得程序更加健壮。
3、JDBC连接数据库:使用JDBC连接数据库时,指定连接数据库的驱动类时用到反射加载驱动类
相关的面试题
1、Java反射创建对象效率高还是通过new创建对象的效率高?
通过new创建对象的效率比较高。通过反射时,先找查找类资源,使用类加载器创建,过程比较繁琐,所以效率较低
2、反射机制的优缺点?
优点:可以动态执行,在运行期间根据业务功能动态执行方法、访问属性,最大限度发挥了java的灵活性。
缺点:对性能有影响,这类操作总是慢于直接执行java代码