Questions tagged «reflection»

反射是计算机程序在运行时检查,自省和修改其自身的结构和行为的能力。

4
为什么创建带有反射的通用setter和getter是一个坏主意?
前一段时间,我写了这个问题的答案,它关于如何避免每个可变变量都具有getter和setter方法。当时,我只有一种难以言表的直觉,认为这是一个坏主意,但OP明确要求这样做。我在这里搜索了这可能是个问题的原因,然后发现了这个问题,其答案似乎认为,除非绝对必要,否则使用反射是不好的做法。 那么,有人可以说出为什么应该避免反射的原因,特别是在通用getter和setter的情况下?
49 java  reflection 

6
为什么要使用反射?
我是Java的新手。通过学习,我读到反射被用来调用类和方法,并知道哪些方法没有实现。 什么时候应该使用反射,使用反射和实例化对象以及以传统方式调用方法之间有什么区别?
29 java  reflection 

5
Java instanceof运算符是否被视为反射,反射的定义是什么?
我今天与同事讨论了使用Java运算符的使用是否instanceof是一种反思。讨论很快演变成实际定义反射的内容。 那么,反射的定义是什么? 并instanceof认为使用了“使用反射”吗? 另外,如果instanceof将其视为反射,那么多态性还不是“利用反射”吗?如果没有,有什么区别?

3
反思:使用反思仍然是“坏”还是“慢”?自2002年以来,反思发生了什么变化?
我已经注意到在处理表达式或表达式树时,我经常使用反射来设置和获取属性以及您所拥有的值。在我看来,反射的使用似乎越来越普遍。诸如用于验证的数据注释,属性繁重的ORM等之类的东西。我想知道:自从几年前和几年前我被告知尽可能避免反思以来,发生了什么变化? 那如果发生了什么变化呢?仅仅是机器的速度吗?是否对框架进行了更改以加快反思? 还是什么都没有真正改变?使用反射还是“不好”还是“慢”?
21 .net  reflection 

6
(过度)使用反射是个坏习惯吗?
如果大大减少了样板代码的数量,使用反射是否是一种好习惯? 基本上,在性能和一方面的可读性与另一方面的抽象/自动化/简化样板代码之间要进行权衡。 编辑:这是推荐使用反射的示例。 举一个例子,假设有一个抽象类Base,其具有10个字段和具有3个亚类SubclassA,SubclassB并且SubclassC每个具有10个不同的字段; 它们都是简单的豆子。问题是您有两个Base类型引用,并且想要查看它们的对应对象是否属于相同(子)类型并且相等。 作为解决方案,有一个原始解决方案,在该解决方案中,您首先要检查类型是否相等,然后检查所有字段,或者可以使用反射并动态查看它们是否属于同一类型,并遍历以“ get”开头的所有方法(约定超出配置),请同时在两个对象上调用它们,并在结果上调用equals。 boolean compare(Base base1, Base, base2) { if (base1 instanceof SubclassA && base2 instanceof SubclassA) { SubclassA subclassA1 = (SubclassA) base1; SubclassA subclassA2 = (SubclassA) base2; compare(subclassA1, subclassA2); } else if (base1 instanceof SubclassB && base2 instanceof SubclassB) { //the same } //boilerplate } …


1
元循环解释器,虚拟机和提高的性能之间有什么关系?
我已经在网上阅读了有关元循环解释器(包括SICP)的信息,并且研究了一些实现的代码(例如PyPy和Narcissus)。 我已经阅读了很多有关两种语言的文章,它们充分利用了元循环评估Lisp和Smalltalk。据我了解,Lisp是第一个自托管的编译器,而Smalltalk具有第一个“真正的” JIT实现。 我尚未完全了解的一件事是,那些解释器/编译器如何才能获得如此出色的性能,或者换句话说,为什么PyPy比CPython更快?是因为反射吗? 而且,我的Smalltalk研究使我相信JIT,虚拟机和反射之间存在联系。诸如JVM和CLR之类的虚拟机允许进行大量的类型自省,我相信它们可以在实时(我想是AOT)编译中大量使用。但是据我所知,虚拟机有点像CPU,因为它们具有基本的指令集。虚拟机是否有效,因为它们包含类型和参考信息,从而可以实现与语言无关的反映? 我之所以这么问,是因为现在许多解释型语言和编译型语言都将字节码用作目标(LLVM,Parrot,YARV,CPython),并且传统的VM(例如JVM和CLR)已经获得了令人难以置信的性能提升。有人告诉我它与JIT有关,但据我所知,自从Smalltalk和Sun自己的Self从事Java以来​​,JIT并不是什么新鲜事物。我不记得过去的VM表现特别出色,JVM和.NET之外的非学术类VM并不多,而且它们的性能绝对不如现在好(我希望可以提出这一主张,但我想从个人经验谈起)。 然后突然之间,在2000年代末,情况发生了变化,甚至对于既定的语言,也出现了许多具有良好性能的VM。是否发现了有关JIT实现的信息,该信息使几乎每个现代VM的性能都飙升了?可能是纸还是书?

3
我需要处理通过反射调用私有方法的情况吗?
创建库时,当不是由同一类的其他方法调用,而是由其他库通过反射调用时,我是否必须确保私有方法必须按预期工作? 例如,如果私有方法private DoSomething(int number)期望: number 是一个非零的正整数,并且: 私有变量string abc不是null也不是空字符串, 和完全的,丑陋的失败,如果这两个条件不匹配,我必须处理这些故障,即使我知道,在类的所有方法将 always¹分配非空值abc调用之前DoSomething,并通过这种积极的非零整数方法? 换句话说,不是通过反射进行不安全调用保护的代码可以被认为是低质量代码,还是属于使用反射来确保调用不会中断任何内容的调用方? 注意:我的问题仅涵盖一组标准库。这不包括必须高度安全的代码(即,当有人可能通过使用反射来使其表现出意外行为或崩溃时感兴趣)。 ¹因为正确记录了该类,所以因为有足够的单元测试来确保任何其他开发人员都不会破坏此方法,等等。

4
标记通过反射调用的方法的最佳实践?
我们的软件有几个类,应该通过反射来动态找到。这些类都有一个带有特定签名的构造函数,反射代码通过该签名实例化对象。 但是,当有人检查是否引用了该方法时(例如,通过Visual Studio Code Lens),则不计入通过反射进行的引用。人们可能会错过他们的引用,并删除(或更改)表面上未使用的方法。 我们应该如何标记/记录打算通过反射调用的方法? 理想情况下,应以同事和Visual Studio / Roslyn以及其他自动化工具都“看到”该方法旨在通过反射调用的方式进行标记。 我知道我们可以使用两个选项,但都不太令人满意。由于Visual Studio找不到引用,因此: 使用自定义属性,并使用此属性标记构造函数。 问题在于,属性属性不能是方法引用,因此构造方法仍将显示为具有0个引用。 不熟悉custom属性的同事可能会忽略它。 我当前方法的一个优点是反射部分可以使用该属性来查找应调用的构造函数。 使用注释来证明打算通过反射调用方法/构造函数。 自动化工具会忽略评论(同事也可能会忽略评论)。 XML文档注释可以用于具有Visual Studio计数的额外参考方法/构造: 让MyPlugin是它的构造经由反射调用的类。假设调用反射代码搜索采用int参数的构造函数。以下文档使代码透镜显示了具有1个引用的构造函数: /// <see cref="MyPlugin.MyPlugin(int)"/> is invoked via reflection 存在哪些更好的选择? 标记要通过反射调用的方法/构造函数的最佳实践是什么?

3
如何设计一个C ++程序以允许在运行时导入功能?
今天,我想问您一个有关C ++实现特定软件体系结构功能的问题。 当然,我使用了搜索但是没有找到任何直接链接的答案。 基本上,我的目标是建立一个程序,使用户可以对任意组成的物理系统(例如驾驶汽车)进行建模和仿真。我假设有一个物理模型库(类中的函数)。每个函数可以具有一些输入,并根据基础的物理描述返回一些输出,例如,内燃机模型,空气阻力模型,车轮模型等。 现在,该想法是为用户提供一个框架,该框架允许他根据自己的需求来组合任何功能,即映射任何身体行为。该框架应提供功能,以连接不同功能的输出和输入。因此,该框架提供了一个容器类。我称它为COMPONENT,它可以容纳一个或多个模型对象(FUNCTION)。这些容器还可以容纳其他组件(参见复合模式)以及功能参数之间的连接(CONNECTOR)。此外,组件类提供了一些通用的数字功能,例如数学求解器等。 功能的组合应在运行时完成。在第一个实例中,用户应该能够通过导入定义合成结构的XML来建立合成。后来,人们可能会想到添加GUI。 为了使您更好地理解,这里是一个非常简化的示例: <COMPONENT name="Main"> <COMPONENT name="A"> <FUNCTION name="A1" path="lib/functionA1" /> </COMPONENT> <COMPONENT name="B"> <FUNCTION name="B1" path="lib/functionB1" /> <FUNCTION name="B2" path="lib/functionB2" /> </COMPONENT> <CONNECTIONS> <CONNECTOR source="A1" target="B1" /> <CONNECTOR source="B1" target="B2" /> </CONNECTIONS> </COMPONENT> 不必要深入研究框架的功能,因为我的问题更为普遍。编译框架代码/程序时,物理问题描述以及用户定义的功能未知。当用户选择功能(通过XML或以后通过GUI)时,框架应读取功能信息,即应获取输入和输出参数的信息,以便为用户提供互连功能的选项。 我知道反射的原理,并且我知道C ++不提供此功能。但是,我确信经常需要“在运行时构建对象”的概念。我应该如何在C ++中设置软件体系结构以实现我的目标?C ++是正确的语言吗?我忽略了什么? 提前致谢! 干杯,奥利弗
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.