面试对线记录11 反射
首先在了解反射之前,需要了解一个静态编译和动态编译的概念,静态编译就是在编译时确定好类型绑定好对象,动态编译就是在运行时确定好类型,绑定对象。反射机制就可以实现动态编译,因为我们在开发很大的那种软件的时候,程序我们都知道,需要编译以后才能进行发布,如果没有反射,我们就需要把整个程序重新编译一份才可以实现功能的更新,如果采用反射的话我们就可以直接在运行时进行动态的创建和编译,没有原来那么麻烦,但是这毫无疑问。。。肯定对性能有影响。
首先要知道在Java中有个东西是Class类,这个玩意在Java中是最nb的一个类,怎么讲呢,如果稍微知道一点JVM就可以知道,在类加载的时候总共有五步,加载,验证,准备,解析和初始化,在加载阶段主要是将字节码加载到方法区还生成了这个类的java.lang.Class对象,这个对象就是用来记录被加载类的类型信息的对象,在Class类中存储了对应类的所有的信息,也是未初始化的信息(所有的方法,所有的构造函数,所有的字段或者说属性)。所以说这个玩意非常强大,可以从官方文档中知道,这个类是在JVM中的。而且这个Class类的构造器是私有的,也是说不能new一个,他是由JVM调用方法来创建该类的对象。
所以说通过反射,我们可以在运行时通过Class类,获得程序或者程序集中每个类型的成员和成员信息,在Java中反射可以在运行时判断任一对象所属类,构造一个类的对象,判断任意一个类所具有的成员变量和方法,通过反射甚至可以调用private方法。通过反射这个特性可以开发各种通用框架,比如Spring框架,通过配置xml文件动态加载所需要记载的对象。
在反射中有以下几种方法
//通过静态方法加载数据库驱动
Class.forName()
//直接获取某一个对象的class
Class<?>klass=int.class
//调用某个对象的getClass()方法
Class<?>klass=str.getClass()
//判断是否为某个类的实例 native方法
private native boolean isInstance(Object obj)
最后反射调用方法时可以忽略权限检查,因此可能会破坏封装性而导致安全性问题。