反射 reflection

本文介绍了如何在Java中使用四种方式获取类:对象实例、forName()、类名.class和基本类型包装类的type属性。通过实例演示了Person、Student和Teacher类的继承关系,并讲解了类加载的过程。

简介:

package com.edward.demo;

public class Test {
    public static void main(String[] args) throws ClassNotFoundException {
        Person person = new Student();
        
        // 方式一:通过对象获得
        Class c1 = person.getClass();
        System.out.println(c1);

        // 方式二:forName获得
        Class c2 = Class.forName("com.edward.demo.Student");
        System.out.println(c2);
    
        // 方式三:类名.class获得
        Class c3 = Student.class;
        System.out.println(c3);
        
        // 方式四:基本内置类型的包装类都有一个type属性
        Class c4 = Integer.TYPE;
        System.out.println(c4);

    }
}

class Person {
    String name;
    public Person () {};
    public Person(String name) {this.name = name;}
    public String getName() {return name;}
    public void setName(String name) {this.name = name;}
    @Override
    public String toString() {return "Person{" +"name='" + name + '\'' +'}';}
}

class Student extends Person {
    public void student () {this.name = "学生";}
}

class Teacher extends Person {
    public void teacher () {this.name = "老师";}
}

### 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、付费专栏及课程。

余额充值