一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情。
假设有一个业务需求:“需要制定一些个人信息的关联规则,比如定义姓名、身份证号相等的信息,根据信息的相似程度关联在一起,且这个关联关系必须是动态的,在程序运行时,我需要能随时更改这些信息”,我们应该如何编码呢?
如果按照硬编码的形式去写,我们可能要写上一大堆 if else,判断此时激活的字段是哪个,从而获取该字段的值,从而执行相应的逻辑,有没有什么方式,让我通过配置的字段名,可以直接获取这个字段的值呢?答案就是反射。
反射将 Java 类中的各种成分(例如类里面的方法、成员变量、构造函数等等)分析映射成一个个的 Java 对象,因此,反射允许我们在运行时发现和使用类的信息;通过反射,我们可以获取任意一个类的所有属性和方法,还可以调用这些属性和方法。
反射的意义
“我们都知道,反射有很多的缺点,世界上这么多厉害的程序员,为什么不解决这个问题呢?为什么任然在大量的使用反射?”
上述提问来自于一次真实的面试经历,当时的面试官给我提出了这样一个问题。
“Good 快斯蠢!”
首先这个提问就让我如沐春风,听过太多次直接的提问:“能给我说一下反射的意义吗?”千篇一律的提问,千篇一律的回答总是让人感到麻木。
使用反射会增加代码的复杂性,降低可维护性,同时也增加了安全的问题,比如反射可以无视泛型参数的安全检查(因为泛型参数的安全检查发生在编译时);另外,大量的使用反射会导致性能问题。
但这并不意味着反射没有用,相反,很多优秀的框架都大量的利用了反射机制去实现功能。
回到文章开头的例子,如果我们要避免在程序中将字段写死,我们可以利用反射:
Field field = Object.class.getDeclaredField("${灵活配置的字段名}");
field.get(object);
上述代码可以让我们成功获取到对象中,这个字段的值,这样,我们就可以在数据库、配置文件等地方灵活的修改字段名,从而避免去修改源代码.
这就是反射最大的优点,它可以提高程序的灵活性和扩展性,降低耦合性,提高自适应能力,反射允许程序创建和控制任何类的对象,而无需提前硬编码目标类。
所以什么是反射?
回到正题,我们来尝试解释一下Java 中的反射机制。
对于 Java 程序,在运行状态中:
- 对于任意一个类,都能知道这个类的属性和方法
- 对于任意一个对象,都能调用它的任意一个属性和方法
这种动态获取信息和动态调用对象方法的功能被称为 Java 语言的反射机制,同时也是 Java 被视为动态语言的一个关键性质
看到这里,相信对反射有一定的了解,那么下一篇就跟我一起深入底层,了解在 Java 中,如何使用反射吧!