当前位置: 首页 > news >正文

江苏建设工程招标网官方网站公司网站平台的作用

江苏建设工程招标网官方网站,公司网站平台的作用,wordpress首页编辑,做网站的公司没有技术在json解析方面 我们常见有下面几方面困扰 1. moshi code-gen能自动生成适配器,序列化效率比gson快,但是自定义程度不如gson,能java kotlin共存 且解决了默认值的问题 2.gson api 强大自由,但是 第一次gson的反射缓存比较慢,而且生成对象都是反射,除非主动注册com.google.gson…

在json解析方面 我们常见有下面几方面困扰

1. moshi code-gen能自动生成适配器,序列化效率比gson快,但是自定义程度不如gson,能java kotlin共存 且解决了默认值的问题
2.gson api 强大自由,但是 第一次gson的反射缓存比较慢,而且生成对象都是反射,除非主动注册com.google.gson.InstanceCreator 这个人工机械
3.kotlin ks 效率还行,但是不支持java  api自由性没有gson强
目前可能更偏向gson 同时也要解决默认值的问题

最大的一处难点是在jvm 获取申明的枚举,先看一下gson是怎么解决的
 

  private static final class EnumTypeAdapter<T extends Enum<T>> extends TypeAdapter<T> {private final Map<String, T> nameToConstant = new HashMap<String, T>();private final Map<T, String> constantToName = new HashMap<T, String>();public EnumTypeAdapter(final Class<T> classOfT) {try {// Uses reflection to find enum constants to work around name mismatches for obfuscated classes// Reflection access might throw SecurityException, therefore run this in privileged context;// should be acceptable because this only retrieves enum constants, but does not expose anything elseField[] constantFields = AccessController.doPrivileged(new PrivilegedAction<Field[]>() {@Override public Field[] run() {Field[] fields = classOfT.getDeclaredFields();ArrayList<Field> constantFieldsList = new ArrayList<Field>(fields.length);for (Field f : fields) {if (f.isEnumConstant()) {constantFieldsList.add(f);}}Field[] constantFields = constantFieldsList.toArray(new Field[0]);AccessibleObject.setAccessible(constantFields, true);return constantFields;}});for (Field constantField : constantFields) {@SuppressWarnings("unchecked")T constant = (T)(constantField.get(null));String name = constant.name();SerializedName annotation = constantField.getAnnotation(SerializedName.class);if (annotation != null) {name = annotation.value();for (String alternate : annotation.alternate()) {nameToConstant.put(alternate, constant);}}nameToConstant.put(name, constant);constantToName.put(constant, name);}} catch (IllegalAccessException e) {throw new AssertionError(e);}}@Override public T read(JsonReader in) throws IOException {if (in.peek() == JsonToken.NULL) {in.nextNull();return null;}return nameToConstant.get(in.nextString());}@Override public void write(JsonWriter out, T value) throws IOException {out.value(value == null ? null : constantToName.get(value));}}

gson的实现 是第一次反射(TypeAdapter 对于rawType gson本身会缓存)
他这个时候能读取到class,但是编译注解这个时候并不能得到class,
那么又查询了官方文档,官方的解释不在是class 而是Element和TypeName的类

翻译如下:
宽松地说,返回直接被该元素包围的元素。 类或接口被认为包含它直接声明的字段、方法、构造函数和成员类型。 包包含其中的顶级类和接口,但不被视为包含子包。 模块将包包含在其中。 封闭的元素可以包括隐式声明的强制元素。 其他种类的元素目前不被认为包含任何元素; 但是,随着 API 或编程语言的发展,这种情况可能会发生变化。
返回:
包含的元素,如果没有则为空列表
API注意事项:
可以使用 ElementFilter 中的方法来隔离某些类型的元素。
也可以看看:
TypeElement.getEnclosureElements、PackageElement.getEnheldElements、ModuleElement.getEnheldElements、Elements.getAllMembers
吉林斯
8.8.9 默认构造函数
吉林斯
8.9 枚举
修改
9
规格
联合项目管理系统

那么我理解jvm 元数据matadata存储在这个数组里面

我打印了一下 得到枚举的全部申明 包括enum_entry(不是enum class)还有valueOf等方法

枚举数据在元数据里面 values(),valueOf(java.lang.String),HELLO,HI,FINE,THANKS,intValue,TestEnum(int),getIntValue()

得按类型过滤出 申明的enum_constant

        val enumConstants = enumElement?.enclosedElements?.filter {it.kind == ElementKind.ENUM_CONSTANT} ?: listOf()

最终折腾了半天 终于出来了


import com.google.gson.annotations.SerializedName
import javax.lang.model.element.ElementKind/*** xxf:生成编译时枚举常量池生成hashmap*/
internal class EnumTypeParser {internal val nameToConstant: MutableMap<String, Any> = mutableMapOf()internal val constantToName: MutableMap<Any, String> = mutableMapOf()/*** 枚举数据在元数据里面 values(),valueOf(java.lang.String),HELLO,HI,FINE,THANKS,intValue,TestEnum(int),getIntValue()* @param enumElement*/constructor(enumElement: javax.lang.model.element.Element?) {val enumConstants = enumElement?.enclosedElements?.filter {it.kind == ElementKind.ENUM_CONSTANT} ?: listOf()enumConstants.forEach { constant ->val annotation: SerializedName? = constant.getAnnotation(SerializedName::class.java)var name = constant.simpleName.toString()//本身名字nameToConstant[name] = constant//注解名字 和别名名字if (annotation != null) {name = annotation.valuefor (alternate in annotation.alternate) {nameToConstant[alternate] = constant}}nameToConstant[name] = constantconstantToName[constant] = name}//排序一下 代码好看一点nameToConstant.toSortedMap().run {nameToConstant.clear()nameToConstant.putAll(this)}//排序一下 代码好看一点constantToName.toSortedMap(Comparator { o1, o2 ->constantToName[o1]!!.compareTo(constantToName[o2]!!)}).run {constantToName.clear()constantToName.putAll(this)}}}

运行效果:

这样就替代了gson 枚举0反射,同样的读写都是o(1)

更多类型的实现 请参考我的开源项目 gson_plugin
这个可能是业界最快的json解析方式 最快的json解析框架

http://www.yayakq.cn/news/826468/

相关文章:

  • 哪些网站开发短视频推广计划
  • 西安招聘网站建设华为官方手表网站
  • 网站收录查询方法html5 开发的网站
  • 全国设计网站建设网站设计流程是什么
  • 网站开发 图片铺满怎么制作网站下载软件
  • 做的网站怎么一搜就能出来国内可以上的网站
  • 在线教育网站html模板wordpress 的导航插件
  • 南宁建设网站哪里好网络维护公司创业计划书
  • 克隆网站后怎么做下载好看影视大全极速版
  • 怎么建立一个网站卖东西西安做h5网站
  • 做网站需多少钱海淀区seo搜索优化
  • 免费做 爱视频网站免费建立单位的网站
  • 网站开发首选语言wordpress vaptcha
  • 禅城网站建设哪家好怎么样自己做网站
  • 福州做网站需要多少钱wordpress 搜狗收录
  • 四川省建行网站展厅布置
  • php网站视频代码一个平台网站开发
  • 做系统的图标下载网站一键搭建的wordpress数据库怎么看
  • 织梦网站访问量统计代码自贡建设网站
  • 廊坊智能模板建站建筑公司简历模板
  • 自己做网站一定要实名吗义乌建设网站
  • 网站 模板建一个网站大约多少钱
  • 河源建设局网站平凉网站建设redu
  • 网站设置为起始页wordpress文章索引
  • 学校做网站需要多少钱外贸 模板网站 定制网站
  • 如何做ps4的游戏视频网站更改网站建设报价
  • 网站备案导致网站被k中国建设银行网站股份结构变化
  • 可以做超链接或锚文本的网站有哪些html常用标签代码大全
  • 监控网站建设需要多少钱网站上传软件
  • seo工具助力集群式网站升级网站导航条设计