反射从0到入门

个人公众号:不是秃头的程序员小李
专注于 Java 内容,欢迎大家前来留言
文章内容比较多,建议收藏

反射从0到入门

反射

Java 分编译期和运行期

编译方式说明:

静态编译:在编译时确定类型 & 绑定对象。如常见的使用new关键字创建对象

动态编译:运行时确定类型 & 绑定对象。动态编译体现了Java的灵活性、多态特性 & 降低类之间的藕合性

以后开始学习的时候,我们都要围绕着下面的问题去展开知识点的学习。

它是什么?

它的作用是什么?

它的优点是什么?缺点是什么?

我们如何使用它?

它的原理是什么?

接下来,我会通过三个章节来讲解反射,分别是《反射从0到入门《反射从入门到精通》《反射的应用》

什么是反射

反射(Reflection)是 Java 的特性之一,它可以让运行中的 Java 程序获取自身的信息,并且可以操作类或者对象的内部属性。

Oracle 官方对反射的解释是:

Reflection enables Java code to discover information about the fields, methods and constructors of loaded classes, and to use reflected fields, methods, and constructors to operate on their underlying counterparts, within security restrictions.

The API accommodates applications that need access to either the public members of a target object (based on its runtime class) or the members declared by a given class. It also allows programs to suppress default reflective access control.

通过反射,我们可以在程序运行时获得程序集中每一个类型的成员和成员信息。我们平时所用的 new 去创建的对象的类型,是在编译期就确定下来了。而 Java 反射可以动态地创建对象并调用其属性,这样的对象的类型在编译期是未知的。所以我们可以通过反射机制创建对象,即使这个对象的类型在编译期是未知的。

反射的核心是 JVM 在运行时才会动态加载类、调用方法和访问属性,它不需要在编译期知道运行的对象是谁。

Java 反射主要提供以下的功能:

在运行时判断任意一个对象所属的类

在运行时构造任意一个类的对象

在运行时判断任意一个类所具有的成员变量和方法

在运行时调用任意一个对象的方法

我们可以在运行时取到「任意」你想要的类、对象、变量、方法等。

注:反射是在运行时操作的,而不是编译时

反射的主要用途

实现工厂模式和代理模式等设计模式。

JDBC 的数据库连接。

Spring、Struts 等框架,使用反射在运行时动态加载需要加载的对象。

IDE 开发工具的提示,比如当我们输入一个对象或类并想调用它的属性或方法时,一按点号,编译器就会自动列出它的属性或方法。

反射的优缺点

优点:

可以在运行期对类型进行判断,动态类加载等操作。

提高代码的灵活度。例如:JDBC 可以动态连接数据库。

缺点:

性能问题

因为反射包括了一些动态类型,所以 JVM 无法对这些代码进行优化。因此,反射操作的效率要比那些直接调用慢的多。所以尽量避免在经常被执行的代码或者对性能要求很高的程序中使用反射。

(反射大概比直接调用慢 50 ~ 100 倍,但是需要在执行 100 万遍的是偶才会有所感觉)

安全限制

使用反射技术要求程序必须在一个没有安全限制的环境中运行。

内部暴漏

反射允许代码执行一些在正常情况下不被允许的操作(访问私有的属性或方法),所以使用反射可能会导致意料之外的副作用 —— 代码有功能上的错误,降低可移植性。反射破坏了代码的抽象性,因此当平台发生改变的时候,代码的行为就可能也随着变化。

提问:Java 反射可以访问和修改私有成员变量,那封装成 private 还有意义么?

既然小偷可以访问和搬走私有成员家具,那封装成防盗门还有意义么?这是一样的道理,并且 Java 从应用层给我们提供了安全管理机制——安全管理器,每个 Java 应用都可以拥有自己的安全管理器,它会在运行阶段检查需要保护的资源的访问权限及其它规定的操作权限,保护系统免受恶意操作攻击,以达到系统的安全策略。

所以其实反射在使用时,内部有安全控制,如果安全设置禁止了这些,那么反射机制就无法访问私有成员。

具体使用 Class

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyfwdg.html