面试官这样问我Java反射原理,我刚好都会

上周我投递出了简历,岗位是java后端开发工程师。这周美团面试官给我进行了面试,面试过程中他问了Java的反射原理。(不得不夸一句,美团的效率真高,上午面完一面,晚上二面马上安排上了。)

无论什么Java技术岗位,Java反射原理,在面试中出现的次数很多,所以我面试之前也有所准备,于是今天结合面试问题先详细讲一讲 Java反射原理

JAVA反射机制

JAVA反射机制是在 运行状态中

对于任意一个类,都能够知道这个类的所有属性和方法;

对于任意一个对象,都能够调用它的任意一个属性和方法;

这种动态获取的信息以及动态调用对象的方法的功能称为 java语言的反射机制

面试官这样问我Java反射原理,我刚好都会

使用场景

IDE自动提示功能,对象(提示:属性、方法)

不知道类或者对象的具体信息,应该使用反射来实现。

比如类的名称放在XML文件中,属性和属性值放在XML文件中,需要在运行时读取XML文件,动态获取类的信息。

原理

Java在编译之后会生成一个 class文件 ,反射通过 字节码文件 找到其类中的方法和属性等

功能

面试官这样问我Java反射原理,我刚好都会

关键类

面试官这样问我Java反射原理,我刚好都会

Class对象

类型标识,JVM中为每个对象都保留其类型标识信息。

包含类的所有信息

可以通过该对象获取到 构造方法,成员变量,成员方法和接口 等信息

获取方法:

  • 通过字面量直接获取,例如XXX.class, 不会触发类的初始化 但XXX类已经被加载到方法区。

  • 通过Object类的getClass方法,例如Object.getClass()。触发类的初始化

  • 通过Class的静态方法,例如Class.forName()。触发类的初始化

面试官这样问我Java反射原理,我刚好都会

Field

成员变量,类中的属性对象。

通过Class类的getDeclaredField()或getDeclaredFields()方法获取

面试官这样问我Java反射原理,我刚好都会

Field的方法主要分为两大类,即getXXX和setXXX

Method

类中的方法对象。包括了静态方法和成员方法(包括抽象方法在内)。

通过invoke()来完成方法被动态调用的目的。

非静态变量,需要添加对象参数

面试官这样问我Java反射原理,我刚好都会
面试官这样问我Java反射原理,我刚好都会

setAccessible()方法不影响其他对象和原方法

getDeclaredMethod

可以获取 指定方法名和参数 的方法对象 Method

@CallerSensitive
public Method getDeclaredMethod(String name, Class<?>... parameterTypes)
    throws NoSuchMethodException, SecurityException {
    checkMemberAccess(Member.DECLARED, Reflection.getCallerClass(), true);
    //从返回的方法列表里找到一个匹配名称和参数的方法对象。
    Method method = searchMethods(privateGetDeclaredMethods(false), name, parameterTypes);
    if (method == null) {
        throw new NoSuchMethodException(getName() + "." + name + argumentTypesToString(parameterTypes));
    }
    return method;
}
复制代码

privateGetDeclaredMethods

缓存或JVM中获取该Class中申明的方法列表。

searchMethods

从返回的方法列表里找到一个 匹配名称和参数 的方法对象。

如果找到一个匹配的 Method ,则重新copy一份返回,即 Method.copy() 方法。

ReflectionData

用来缓存从JVM中读取类的如下属性数据

Constructor

构造函数。类的构造方法

getConstructor() :获取匹配的构造方法

面试官这样问我Java反射原理,我刚好都会

步骤:

  1. 先获取所有的constructors, 然后通过进行 参数类型 比较;

  2. 找到匹配后,通过 ReflectionFactory,copy一份constructor返回;

  3. 否则抛出 NoSuchMethodException;

父类/父接口

面试官这样问我Java反射原理,我刚好都会

优点

通过反射,java可以动态的加载未知的 外部配置对象临时生成字节码 进行加载使用,使代码更灵活,极大地提高应用的扩展性。

原文 

https://juejin.im/post/5efac8b5f265da22fe240a91

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » 面试官这样问我Java反射原理,我刚好都会

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址