美文网首页
swift-Mirror反射

swift-Mirror反射

作者: GitArtOS | 来源:发表于2021-08-27 15:51 被阅读0次

struct GitArtOS {
    var age = 18
    var name = "FGH"
    var subclassName = "二年级"
    
}

struct GitArtOSMetadata {
    var kind:        Int
    var description: UnsafeMutablePointer<GitArtOSMetadataDesc>
}

struct GitArtOSMetadataDesc {
    var flags:              UInt32
    var parent:             UInt32  // 展示用Uint32代替,实际是相同大小的结构体,
    var name:               GitArtOSDirectPointer<CChar>
    // . . .  (当前研究获取属性类型,后面的属性先不管)
    var accessFunctionPtr:       GitArtOSDirectPointer<UnsafeRawPointer>  // 不在乎具体类型,就先用UnsafeRawPointer
        var fields:                  GitArtOSDirectPointer<GitArtOSFieldDescription>  // 不在乎具体类型,就先用UnsafeRawPointer
        var numFields:               UInt32  // 属性个数
        var fieldOffsetVectorOffset: UInt32
}

struct GitArtOSDirectPointer<T>{
    var offset: Int32
    
    // 偏移offset位置,获取内容指针
    mutating func get() -> UnsafeMutablePointer<T> {
        let offset = self.offset
        // withUnsafePointer获取指针
        return withUnsafePointer(to: &self) { p in
            // UnsafeMutablePointer 返回T类型对象的指针
            // UnsafeRawPointer将p指针转换为未知类型
            // numericCast将offset转换为偏移单位数
            // advanced进行内存偏移
            // assumingMemoryBound绑定指针为T类型
            return UnsafeMutablePointer(mutating: UnsafeRawPointer(p).advanced(by: numericCast(offset)).assumingMemoryBound(to: T.self))
        }
        
    }
}


// 记录结构体内所有属性的结构
struct GitArtOSFieldDescription {
    var MangledTypeName:         GitArtOSDirectPointer<CChar>
    var Superclass:              GitArtOSDirectPointer<CChar>
    var Kind:                    UInt16
    var FieldRecordSize:         UInt16
    var NumFields:               UInt32
    var fgfields:                  GitArtOSFieldRecord // 连续存储空间 (有几个数据,就会在后面添加几个记录,通过内存平移读取)
}

// 每个属性的内容
struct GitArtOSFieldRecord {
    var flag:                    Int32
    var mangledTypeName:         GitArtOSDirectPointer<CChar>
    var fieldName:               GitArtOSDirectPointer<CChar>   // 属性名称
}


let gitartos = unsafeBitCast(GitArtOS.self as Any.Type, to:  UnsafeMutablePointer<GitArtOSMetadata>.self)
let namePtr = gitartos.pointee.description.pointee.name.get()
print(String(cString:namePtr ))
//GitArtOS
let count = gitartos.pointee.description.pointee.numFields
print("GitArtOS属性个数:\(count)")


// 单独读取第一个属性名
var fields = gitartos.pointee.description.pointee.fields.get()
let fieldRecord1Name = fields.pointee.fgfields.fieldName.get()
print(String(cString: fieldRecord1Name))

// 读取所有记录
print("----读取所有属性名----")
(0..<count).forEach { index in
    let recordPtr = withUnsafePointer(to: &fields.pointee.fgfields) {
        return UnsafeMutablePointer(mutating: UnsafeRawPointer($0).assumingMemoryBound(to: GitArtOSFieldRecord.self).advanced(by: Int(index)))
    }
    print(String(cString: recordPtr.pointee.fieldName.get()))
}

print("--GitArtOS --dump----")
dump(GitArtOS()) // 相似的实现方式

打印结果:

GitArtOS
GitArtOS属性个数:3
age
----读取所有属性名----
age
name
subclassName
--GitArtOS --dump----
▿ __lldb_expr_22.GitArtOS
  - age: 18
  - name: "FGH"
  - subclassName: "二年级"

Mirror 可以动态获取类型成员变量,在运行时可以调用方法属性等行为的特性.

  1. Mirror.swift文件
  2. 初始化方法 public init(reflecting subject: Any) 和 获取属性个数_getChildCount
  3. 类型获取 搜索_getNormalizedType:
  4. 分析结构: structMetadataRelativeDirectPointer

相关文章

  • swift-Mirror反射

    打印结果: Mirror 可以动态获取类型、成员变量,在运行时可以调用方法、属性等行为的特性. Mirror.sw...

  • Swift-Mirror类型转字典

    看了onevcat的文章,觉得看了一遍什么都没记住,然后似乎又都理解了。这种感觉非常好,然后就playground...

  • Java基础之反射

    Java基础之反射 反射基本介绍 反射的使用通过反射调用属性和方法通过反射获取配置文件 反射基本介绍 Java反射...

  • 镜面反射矩阵的推导

    镜面反射是以镜面作为反射平面,实物与反射物到反射平面的距离相等,实物与反射物方向相反,所以,反射矩阵由反射平面确定...

  • reflect.go包学习_之二 指针操作提高反射性能 反射应用

    reflect.go包学习_之二 指针操作提高反射性能 反射应用 反射创建实例 反射信息、反射调用方法、反射修改值...

  • Java互联网公司-经典面试题附答案

    基础:Java 反射?反射有什么缺点?你是怎么理解反射的(为什么框架需要反射)?优点:反射具有解耦性,缺点:反射属...

  • Java反射与joor反射库的使用

    java原生反射的使用 反射构造对象 反射方法 反射字段 joor反射库的使用 github:https://gi...

  • Java反射

    什么是反射? 反射的作用? 反射性能优化?

  • 反射三定律

    反射第一定律:反射可以将interface类型变量转换成反射对象 反射第二定律:反射可以将反射对象还原成inter...

  • 反射

    1.反射是什么?反射的定义,概念 2.为什么要学反射? 3.怎么使用反射?反射的使用

网友评论

      本文标题:swift-Mirror反射

      本文链接:https://www.haomeiwen.com/subject/ormmiltx.html