面试 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。

@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() :获取匹配的构造方法

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

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

否则抛出 NoSuchMethodException;

父类/父接口

优点

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

总结

咱们玩归玩,闹归闹,别拿面试开玩笑。

Java的反射特性是java的高级特性,在面试中屡屡碰到。面试官问的问题往往都是有关联性的,一旦问到了,大家一定要回答正确,不要丢三落四,回答到点上。大家面试前要把反射特性的原理、应用场景、功能和关键类(Class、Fileds、Methods、Constructor等)熟记。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值