Reflect Metadata

简介: Reflect Metadata

Reflect MetadataES7(ES2016) 的一个提案。当然,并没有通过,否则就能直接用了,注意:它是 ES6Reflect API的扩展。它主要用来在声明的时候添加和读取元数据


设计目的

Reflect Metadata 的目的是给对象添加额外的信息,但是不影响对象的结构,这一点至关重要!也就是当我们给对象添加一些原始信息的时候,对象是不会有任何变化的,不会多 property ,也不会有 property 被修改,更不会删除已有的 property


实现原理

首先,对于一个对象来说,它可以有很多个metadata ,每一个 metadata 都有一个 key ,以及 metadatavalue ,同时,相同对象下的 metadatakey 应该是唯一的,不可重复的。而且从设计目的出发,又不会修改对象。通过阅读源码,发现作者是通过维护一个 全局变量 的方式来实现的。


核心代码

const usePolyfill = typeof process === "object" && process.env && process.env["REFLECT_METADATA_USE_MAP_POLYFILL"] === "true";
const _Map: typeof Map = !usePolyfill && typeof Map === "function" && typeof Map.prototype.entries === "function" ? Map : CreateMapPolyfill();
const _WeakMap: typeof WeakMap = !usePolyfill && typeof WeakMap === "function" ? WeakMap : CreateWeakMapPolyfill();
const Metadata = new _WeakMap<any, Map<string | symbol | undefined, Map<any, any>>>();点击复制复制失败已复制


上述代码中 Metadata 就是作者维护的全局变量。(代码中有一些polyfill相关的,影响阅读,专注核心即可)


Metadata 是一个 WeakMap 类型,使用 WeakMap 而不是 Map 这个问题请转至笔记Javascript WeakMap。看起来三层 Map 会比较绕,我们从元数据的获取角度来看这个


结构:

Metadata.get(target).get(property).get(key)


其中:

  • target:类
  • property:属性,如果是类的metadata,这里是undefined
  • key:metadata key


这时候就会看起来很清晰了,整个 reflect-metadata 库无非就是维护这个全局变量而已!


核心思想是有了,接下来看一下具体使用方式:Reflect Metadata用法

目录
相关文章
|
Dubbo 应用服务中间件
java.io.IOException: invalid constant type: 18
java.io.IOException: invalid constant type: 18
691 0
java.io.IOException: invalid constant type: 18
|
11月前
|
fastjson
修复fastjson的java.lang.IllegalArgumentException: Comparison method violates its general contract!
修复fastjson的java.lang.IllegalArgumentException: Comparison method violates its general contract!
96 0
|
4月前
|
JavaScript Java API
30.【TypeScript 教程】Reflect Metadata
30.【TypeScript 教程】Reflect Metadata
61 4
|
5月前
|
Go
go 反射Reflect
go 反射Reflect
|
5月前
|
JSON 缓存 测试技术
反射之 reflect.TypeOf() 和 reflect.Type
反射之 reflect.TypeOf() 和 reflect.Type
148 0
java.io.IOException: Requested internal only, but not enough space
java.io.IOException: Requested internal only, but not enough space
675 0
|
Java Maven
maven报错 java.lang.RuntimeException: com.google.inject.CreationException: Unable to create injector,
maven报错 java.lang.RuntimeException: com.google.inject.CreationException: Unable to create injector,
maven报错 java.lang.RuntimeException: com.google.inject.CreationException: Unable to create injector,
|
自然语言处理 Java 编译器
Go REFLECT Library | 01 - 反射的类型 Type
Go REFLECT Library | 01 - 反射的类型 Type
Go REFLECT Library | 01 - 反射的类型 Type
java中出现Syntax error, annotations are only available if source level is 1.5 or greater
java中出现Syntax error, annotations are only available if source level is 1.5 or greater
java中出现Syntax error, annotations are only available if source level is 1.5 or greater
Go REFLECT Library | 06 - reflect.Type 和 reflect.Value 应用
Go REFLECT Library | 06 - reflect.Type 和 reflect.Value 应用