反射reflection

反射的定义

在计算机领域中的反射和光学上的反射在概念上有类似之处。正是因为光在镜面发生了反射,人们才能在镜子中看到自己。而计算机领域的反射也是如此--因为有了反射,程序可以在运行时,通过反射看到自己,审视自己。不同的是人们不能改变自己在镜子中的摸样,而计算机程序不仅可以看到自己,还能改变自身的行为。

下面是两种反射的定义:

1, A program that can analyze the capabilities of classes is called reflective.

2, Reflection is commonly used by programs which require the ability to examine or modify the runtime behavior of applications running in the Java virtual machine.

 

总结一下反射典型的用途是

1,Extensibility Features 比如我们在代码中使用log4j这种第三方工具,调用了它的一个方法。而引用的jar包中都是class文件(字节码),那么怎么才能知道引用的是否正确呢?这里必须使用反射。

2,Class Browsers and Visual Development Environments 指IDE中需要使用反射的地方。例如没有反射,我们就不能在IDE中方便的浏览所引用的class的内容。

3,Debuggers and Test Tools 这里特别提到了代码覆盖率的问题:

 Test harnesses can make use of reflection to systematically call a discoverable set APIs defined on a class, to insure a high level of code coverage in a test suite.

指一些测试工具利用反射确定测试用例的代码覆盖率问题。

 

然后是反射的缺点

1,性能差

Because reflection involves types that are dynamically resolved, certain Java virtual machine optimizations can not be performed.

2,安全问题

3, Since reflection allows code to perform operations that would be illegal in non-reflective code 所以暴露class内部+不当使用可能会导致一些问题。

 

如何使用反射

其实使用反射很简单~~就是调用relection 提供的APIs~

For every type of object, the Java virtual machine instantiates an immutable instance of java.lang.Class which provides methods to examine the runtime properties of the object including its members and type information.

这个java.lang.Class实际指一个名叫class的类,不是平时说的广义上的类。


例如java.lang.class类中的getClass()方法可以返回一个Class的实例:

Employee e;
Class cl = e.getClass();

反射是如何实现的

由上面的例子我们可以知道,在java程序运行时JVM中存储了类的内部信息,而程序代码可以访问这些信息。例如上例,假如代码使用了Spring,对象e的类型是在运行时决定的,那么e.getClass()就是从JVM中得到e的真实类型,而不是从代码的语义上分析出来的。

除了runtime,在编写代码时,反射也会起作用。例如前面提到的IDE的功能,java程序就不在运行中。


reflection的概念已经清楚了。剩下的内容可以分为三个方面:

1,Using Reflection to Analyze the Capabilities of Classes

2,Using Reflection to Analyze Objects at Runtime

(1,2都包括取得类的构造函数,成员变量,成员方法,Modifier 修饰符的方法。)

3,其他一些reflection的应用包括array,proxy和reflection permission。

具体去看java.lang.reflect package。这东西等以后具体要用的时候再研究~~~

### C++中的反射机制 C++作为一种静态类型的编程语言,在标准库中并未提供内置的反射功能。然而,通过一些第三方工具和库的支持,可以实现一定程度上的反射能力。Clang编译器提供了强大的AST解析接口,允许开发者编写自定义工具来访问源代码的抽象语法树(Abstract Syntax Tree, AST),从而间接实现了反射的功能[^4]。 #### 使用Clang进行反射 Clang不仅是一个独立的编译器,还提供了一个可重用的API——`libclang` 和 `LibTooling`,它们能够帮助开发人员创建自己的工具并操作C++代码的AST。这些工具使得程序可以在运行时获取关于自身的结构化信息,例如类成员、函数签名等。这种技术实际上就是一种形式的反射或元编程。 #### 第三方库支持 除了利用Clang之外,还有一些专门设计用于解决C++反射需求的开源项目: 1. **RTTR (Run-Time Type Reflection)** RTTR 是一个轻量级的C++库,旨在为用户提供类似于其他现代语言中存在的强大而灵活的反射系统。它无需修改现有代码即可工作,并且完全兼容标准C++[^5]。 2. ** Reflex** ROOT框架的一部分,Reflex 提供了一种方式来自动生成描述C++类型系统的XML文件或者动态链接库(DLL),这使得应用程序能够在执行期间查询有关数据类型的细节[^6]。 3. **Boost.Hana** Boost.Hana 是另一个值得关注的选择,尽管它的主要目标并不是传统意义上的“反射”,但它确实可以通过模板元编程技巧达到某些类似的用途。Hana专注于泛型算法以及高效的数据处理模式,适用于构建复杂的DSL(domain-specific language)[^7]。 以下是基于RTTR的一个简单示例展示如何注册类及其属性以便于后续检索: ```cpp #include <rttr/registration> using namespace rttr; struct Point { int x; double y; }; // 注册Point类到RTTR系统中 RTTR_REGISTRATION { registration::class_<Point>("Point") .property("x", &Point::x) .property("y", &Point::y); } ``` 上述代码片段展示了怎样借助宏定义将普通的POD(Plain Old Data Structures)转换成具备完整元信息的对象实例。之后我们就可以轻松地遍历其字段名称列表或者其他关联特性了。 ### 总结 虽然原生C++缺乏全面成熟的反射解决方案,但凭借诸如Clang这样的先进基础设施加上众多优秀的社区贡献成果,完全可以满足大多数实际应用场景下的需求。未来随着标准化进程推进或许会有更加统一便捷的方式被采纳进来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值