![]() |
1
1511
名称反射用于描述能够检查同一系统(或其本身)中其他代码的代码。 例如,假设Java中有一个未知类型的对象,如果存在的话,您希望调用它的“doOffice”方法。Java的静态打字系统并不是真正设计来支持这个的,除非对象符合一个已知的接口,但是使用反射,你的代码可以查看对象并找出它是否有一个叫做“DoMeOffice”的方法,然后调用它。 所以,在Java中给你一个代码例子(想象一下这个对象是FO):
Java中一个非常常见的用例是注释的用法。例如,JUnit4将使用反射在类中查找带有@test注释的方法,然后在运行单元测试时调用这些方法。 有一些很好的反思例子可以让你开始学习 http://docs.oracle.com/javase/tutorial/reflect/index.html 最后,是的,这些概念在其他支持反射的静态类型语言(如C)中非常相似。在动态类型语言中,上面描述的用例是不必要的(因为编译器将允许对任何对象调用任何方法,如果不存在则在运行时失败),但是查找以某种方式标记或工作的方法的第二种情况仍然很常见。 从注释更新:
|
![]() |
2
210
例如,Java中的所有对象都有该方法。
反射非常重要,因为它可以让您编写在编译时不必“了解”所有内容的程序,使它们更具动态性,因为它们可以在运行时绑定在一起。代码可以根据已知的接口编写,但实际使用的类可以使用配置文件中的反射进行实例化。 由于这个原因,许多现代框架广泛使用反射。大多数其他现代语言也使用反射,在脚本语言(如python)中,它们更紧密地集成在一起,因为在这些语言的通用编程模型中感觉更自然。 |
![]() |
3
94
我最喜欢的反射方法之一是下面的Java转储方法。它以任何对象作为参数,并使用Java反射API打印出每个字段名和值。
|
![]() |
4
66
反射的使用 反射通常由需要检查或修改在Java虚拟机中运行的应用程序运行时行为的程序使用。这是一个相对高级的特性,只能由对语言基础有很强掌握的开发人员使用。考虑到这一点,反射是一种强大的技术,可以使应用程序执行本来不可能执行的操作。 可扩展性特征 应用程序可以通过使用完全限定的名称创建扩展性对象的实例来使用外部的、用户定义的类。 类浏览器和可视化开发环境 类浏览器需要能够枚举类的成员。可视化开发环境可以从使用反射中可用的类型信息来帮助开发人员编写正确的代码中获益。 调试程序和测试工具 调试器需要能够检查类中的私有成员。测试工具可以利用反射来系统地调用在类上定义的可发现集API,以确保测试套件中的代码覆盖率较高。 反射的缺点 反思是强大的,但不应滥用。如果可以在不使用反射的情况下执行操作,那么最好避免使用反射。在通过反射访问代码时,应记住以下问题。
因为反射涉及动态分解的类型,所以无法执行某些Java虚拟机优化。因此,反射操作的性能比不反射操作的性能要慢,应该避免在性能敏感应用程序中经常调用的代码部分使用反射操作。
反射需要在安全管理器下运行时可能不存在的运行时权限。对于必须在受限安全上下文(如小程序)中运行的代码,这是一个重要的考虑因素。
由于反射允许代码执行在非反射代码中非法的操作,例如访问私有字段和方法,因此使用反射可能会导致意外的副作用,这可能会导致代码功能不正常,并可能破坏可移植性。反射代码会破坏抽象,因此可能会随着平台的升级而改变行为。 |
![]() |
5
37
|
![]() |
6
32
并非每种语言都支持反射,但支持反射的语言的原则通常是相同的。 反射是对程序结构进行“反射”的能力。或者更具体。要查看您拥有的对象和类,并以编程方式获取有关它们实现的方法、字段和接口的信息。您还可以查看注释之类的内容。 它在很多情况下都很有用。您希望能够在任何地方动态地将类插入到代码中。许多对象关系映射器都使用反射来实例化数据库中的对象,而不预先知道它们将使用什么对象。插件架构是另一个反射有用的地方。在这些情况下,能够动态加载代码并确定是否有实现正确的接口作为插件的类型是很重要的。 |
![]() |
7
31
反射允许在运行时动态地实例化新对象、调用方法和对类变量执行get/set操作,而不必事先了解其实现。
在上面的示例中,空参数是要在其上调用方法的对象。如果方法是静态的,则提供空值。如果方法不是静态的,那么在调用时需要提供有效的myObject实例,而不是空的。 反射还允许您访问类的私有成员/方法:
.
反射是一个非常强大的API,但是如果使用过量,它可能会减慢应用程序的速度,因为它在运行时解析所有类型。 |
![]() |
8
20
例子:
|
![]() |
9
19
Java反射非常强大,非常有用。 Java反射使之成为可能 在运行时检查类、接口、字段和方法, 在编译时不知道类、方法等的名称。 也有可能 使用反射实例化新对象、调用方法和获取/设置字段值。 一个快速的Java反射示例,向您展示使用反射的方式:
此示例从名为MyObject的类中获取Class对象。使用类对象,该示例获取该类中方法的列表,迭代这些方法并打印出它们的名称。 Exactly how all this works is explained here 编辑 :将近一年后,我正在编辑这个答案,因为在阅读有关反射的文章时,我很少再使用反射。
当Spring上下文处理这个<bean>元素时,它将使用class.forname(string)和参数“com.example.foo”来实例化该类。 然后,它将再次使用反射为<property>元素获取适当的setter,并将其值设置为指定的值。
对于私有方法,
对于私有领域,
|
![]() |
10
14
根据我的理解: 反射允许程序员动态访问程序中的实体。也就是说,在编写应用程序时,如果程序员不知道某个类或其方法,他可以使用反射动态地(在运行时)使用该类。 它经常用于类名经常更改的场景中。如果出现这种情况,程序员就很难一次又一次地重写应用程序并更改类的名称。 相反,通过使用反射,需要担心类名可能会发生更改。 |
![]() |
11
14
反射 是用于检查或修改 方法、类、接口 在运行时。
这个
反射 可用于获取有关
这个 反射API 主要用于:
集成开发环境,如Eclipse、MyEclipse、NetBeans等。
使用反射的优点: 可扩展性特征: 应用程序可以通过使用完全限定的名称创建扩展性对象的实例来使用外部的、用户定义的类。 调试和测试工具: 调试器使用反射属性来检查类上的私有成员。 缺点: 性能开销: 反射操作的性能比不反射操作的性能要慢,应该避免在性能敏感的应用程序中经常调用的代码部分使用反射操作。 内部暴露: 反射代码会破坏抽象,因此可能会随着平台的升级而改变行为。 |
![]() |
12
13
反射是一组函数,允许您访问程序的运行时信息并修改它的行为(有一些限制)。 它很有用,因为它允许您根据程序的元信息更改运行时行为,也就是说,您可以检查函数的返回类型并更改处理情况的方式。 例如,在C中,您可以在运行时加载程序集(a.dll)并检查它,在类中导航并根据找到的内容执行操作。它还允许您在运行时创建类的实例,调用其方法等。 在哪里有用?不是每次都有用,而是针对具体情况。例如,您可以使用它获取用于loggin目的的类的名称,根据配置文件上指定的内容,常规地为事件创建处理程序,等等… |
![]() |
13
13
反射的简单示例。 在下棋游戏中,您不知道用户在运行时会移动什么。反射可用于调用已在运行时实现的方法。
|
![]() |
14
10
反射就是让物体看到它们的外观。这个论点似乎与反思无关。实际上,这就是“自我识别”能力。 反射本身就是这样的语言,它缺乏自我知识和自我感觉的能力。因为他们没有自知之明的能力,当我们想观察它是什么样子的时候,我们必须有另一件事情来思考它是什么样子的。优秀的动态语言(如Ruby和Python)可以在没有其他人帮助的情况下感知自己的反射。我们可以说,Java的对象无法感知没有镜像的镜像,它是反射类的对象,但是Python中的对象可以不用镜子来感知它。这就是为什么我们需要在Java中进行反射的原因。 |
![]() |
15
8
我只想在所有列出的内容中添加一些要点。
用
反射API
你可以写环球
它对调试很有用。 下面是一些例子:
|
![]() |
16
8
从Java文档 page
包中的类,以及
它包括以下功能。
看看这个
documentation
所暴露方法的链接
由此 article (作者:Dennis Sosnoski,Sosnoski Software Solutions,Inc.总裁)以及 article (安全探索pdf): 比起使用反射,我可以看到很多缺点。 反射用户:
反射的缺点:
一般虐待:
看看这个关于反射功能滥用的SE问题: How do I read a private field in Java? 总结: 从系统代码中不安全地使用其功能也很容易导致Java安全模式的妥协。 L. 所以要谨慎使用这个特性 |
![]() |
17
8
顾名思义,除了提供在运行时动态调用方法创建实例的功能外,它还反映了它所持有的内容,例如类方法等。 许多框架和应用程序都使用它来调用服务,而实际上并不知道代码。 |
![]() |
18
5
|
![]() |
19
5
反射使您能够编写更通用的代码。它允许您在运行时创建一个对象,并在运行时调用其方法。因此程序可以高度参数化。它还允许自省对象和类,以检测暴露在外部世界中的变量和方法。 |
![]() |
20
2
我想举例回答这个问题。首先
交替工程
我们从Java 7
因为在这种情况下很难犯打字错误。 |
![]() |
21
-7
Java反射使得可以在运行时检查类、接口、字段和方法,而不知道编译时类、方法等的名称。大多数情况下,在框架级别,反射的最大好处是可以实现的。如果在运行时需要额外修改来检查、修改、在自身中添加更多字节代码,或者在方法级别、实例变量级别、构造函数级别、注释级别反射等其他程序或框架,则编译的字节代码是有用的。
假设你有一个方法
|
![]() |
JBryanB · 如何从基本抽象类访问类属性 1 年前 |
![]() |
Gabe Tucker · 无法在golang中分配接口对象指针 2 年前 |
![]() |
jkone27 · F#-在编译时从字符串生成简单的空类型 7 年前 |
![]() |
John Bustos · C#通用工厂模式,不说明通用工厂模式的类型 7 年前 |
![]() |
Randall Flagg · 访问propertyinfo中的属性 7 年前 |
![]() |
Kacper · 在反映的全名和成员c后的“*”中,“+”是什么意思# 7 年前 |
![]() |
tobeypeters · 反射铸造 7 年前 |
![]() |
myst02 · 如何在另一个方法之后调用该方法? 7 年前 |