Java|面试官你要这么问我Java反射原理,我就笑了


Java|面试官你要这么问我Java反射原理,我就笑了
文章图片
Java|面试官你要这么问我Java反射原理,我就笑了
文章图片
Java|面试官你要这么问我Java反射原理,我就笑了
文章图片
Java|面试官你要这么问我Java反射原理,我就笑了
文章图片
Java|面试官你要这么问我Java反射原理,我就笑了
文章图片
Java|面试官你要这么问我Java反射原理,我就笑了
文章图片
上周我投递出了简历 , 岗位是java后端开发工程师 。 这周美团面试官给我进行了面试 , 面试过程中他问了Java的反射原理 。 (不得不夸一句 , 美团的效率真高 , 上午面完一面 , 晚上二面马上安排上了 。 )
无论什么Java技术岗位 , Java反射原理 , 在面试中出现的次数很多 , 所以我面试之前也有所准备 , 于是今天结合面试问题先详细讲一讲 Java反射原理  。
JAVA反射机制JAVA反射机制是在 运行状态中  ,
对于任意一个类 , 都能够知道这个类的所有属性和方法;
对于任意一个对象 , 都能够调用它的任意一个属性和方法;
这种动态获取的信息以及动态调用对象的方法的功能称为 java语言的反射机制 。
使用场景IDE自动提示功能  , 对象(提示:属性、方法)
不知道类或者对象的具体信息 , 应该使用反射来实现 。
比如类的名称放在XML文件中 , 属性和属性值放在XML文件中 , 需要在运行时读取XML文件 , 动态获取类的信息 。
原理Java在编译之后会生成一个 class文件  , 反射通过 字节码文件 找到其类中的方法和属性等
功能
关键类
Class对象类型标识 ,  JVM中为每个对象都保留其类型标识信息 。
包含类的所有信息
可以通过该对象获取到 构造方法 , 成员变量 , 成员方法和接口 等信息
获取方法:
通过字面量直接获取 , 例如XXX.class , 不会触发类的初始化但XXX类已经被加载到方法区 。
通过Object类的getClass方法 , 例如Object.getClass() 。 触发类的初始化
通过Class的静态方法 , 例如Class.forName() 。 触发类的初始化
Field成员变量 ,  类中的属性对象 。
通过Class类的getDeclaredField()或getDeclaredFields()方法获取
Field的方法主要分为两大类 , 即getXXX和setXXX
Method类中的方法对象 。 包括了静态方法和成员方法(包括抽象方法在内) 。
通过invoke()来完成方法被动态调用的目的 。
非静态变量 , 需要添加对象参数
setAccessible()方法不影响其他对象和原方法
getDeclaredMethod

可以获取 指定方法名和参数 的方法对象 Method  。
privateGetDeclaredMethods从缓存或JVM中获取该Class中申明的方法列表 。
searchMethods从返回的方法列表里找到一个 匹配名称和参数 的方法对象 。
如果找到一个匹配的 Method  , 则重新copy一份返回 , 即 Method.copy() 方法 。


推荐阅读