阿里高频面试题:你可以讲下什么是反射吗?

2019年以来,互联网行业持续性的寒冬不断加剧,再加上整个行业对于程序员的需求趋于饱和,相应的对于程序员的能力要求也是越来越高,传统的

CURD工程师逐渐退出市场,对于广大程序员群体来说,如果想要跟上历史潮流不被时代抛弃,就要不断地提高自身的技术能力,以便在互联网寒冬的今天能够有一席之地。

阿里高频面试题:你可以讲下什么是反射吗?

当我们面对一项新的知识时,我们往往需要知道三个方面,它是什么?为什么要使用它?我们该怎么使用它?


是什么

  “Java Reflaction in Action”有这么一句话,可以解释。反射是运行中的程序检查自己和软件运行环境的能力,它可以根据它发现的进行改变。通俗的讲就是反射可以在运行时根据指定的类名获得类的信息。

为什么

我们为什么要使用反射,它的作用是什么,它在实际的编程中有什么应用。首先我们先明确两个概念,静态编译和动态编译。

  静态编译:编译时确定类型,绑定对象。

  动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了Java的灵活性,体现了多态的应用,降低类之间的耦合。

我们可以明确的看出动态编译的好处,而反射就是运用了动态编译创建对象。

那么我们再来看看实际中反射又有什么好处那?往往对比能更加直观的向我们展示两者的不同。若是不用反射,它是这样的


阿里高频面试题:你可以讲下什么是反射吗?


构造工厂类,也就是说以后如果我们在添加其他的实例的时候只需要修改工厂类就行了


阿里高频面试题:你可以讲下什么是反射吗?

可以发现,每当我们要添加一种新的水果的时候,我们将不得不改变Factory中的源码,而往往改变原有正确代码是一种十分危险的行为。而且随着水果种类的增加,你会发现你的factory类会越来越臃肿,不得不说这是一种十分lowB的做法。(初学者可能会问,我们为什么不直接在main方法中new水果那,我们可能会需要getInstance方法做一些别的事情。。。所以不直接new),而反射无疑是一种聪明的办法,用反射实现上述工厂类


阿里高频面试题:你可以讲下什么是反射吗?

在出现新品种水果的时候,你完全不用去修改原有代码。从上面的案例中,我们可以清楚的体会到反射的优越性。

那么有的人又会问,这个例子能完全明白,但是如果放到实际的编程,应用中,我们又会在什么情况下用到反射那?

举一个看到过的例子,在实际开发中,我们需要把一个包中的class new出来,但是这个包中的类总是需要变动,那么怎么办,难道总是修改main方法中xxx=new xxx()吗。这样无疑是麻烦的。而运用反射。我们可以相应的增加一个配置文件,在里面记录包中所有的类名,包中类增加时就加一个类名,删除时就删除一个类名。让main方法去读取这个配置文件中的类名,通过反射获得实例,完全不用我们去修改main方法中的代码。

反射还有什么用呢?它甚至可以修改一个类(实例)中的私有属性。Java开发中,我们需要改变一个私有标志位的时候,Java源码并没有提供set方法,我们又不能改变源码,怎么办,反射可以完美解决这个问题。

说了这么多,那么我们的开发中,为什么不全部都用反射那?一个原因,开销,它的开销是十分昂贵的,随意尽量在最需要的地方使用反射。

怎么用

  说完是什么,为什么,我们必然需要掌握如何使用反射,先看反射中涉及了那些方法。

  • 获取类;className必须为类的全限定名

  Class c=Class.forName("className");

  • 创建类的实例

Object obj=c.newInstance();

  • 获得构造函数的方法

Constructor getConstructor(Class[] params);

Constructor[] getConstructors();

Constructor getDeclaredConstructor(Class[] params);

Constructor[] getDeclaredConstructors();

  • 获得类方法的方法

Method getMethod(String name, Class[] params);

Method[] getMethods();

Method getDeclaredMethod(String name, Class[] params);

Method[] getDeclaredMethods();

  • 获得类中属性的方法

Field getField(String name);

Field[] getFields();

Field getDeclaredField(String name);

Field[] getDeclaredFields();

  看到这些方法,你就可以明白,反射是多么的强大了,当你正确使用这些方法的时候,基本上是掌握了反射的技巧,更不用说和面试官对答如流了。


关注评论后可

私信获取更多最新大厂面试资料,如果你需要一线互联网公司的内推机会(社招+校招),也可以私聊我哦


分享到:


相關文章: