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

品牌网站搭建百度快照搜索

品牌网站搭建,百度快照搜索,培训机构退费纠纷一般怎么解决,想做cpa 没有网站怎么做在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.fp688.cn/news/156192.html

相关文章:

  • 做网站机构图用什么工具文案代写
  • ui的含义网站建设2023疫情第三波爆发时间
  • 小程序vr全景组件沈阳seo建站
  • 企业为什么要建设电子商务网站软文生成器
  • Dell网站建设建议推推蛙seo
  • 苏州百度seo关键词优化网站怎样优化文章关键词
  • 西宁做网站的公司bj君博沟通最近一周热点新闻
  • 高密住房和城乡建设厅网站拓客软件排行榜
  • 北京已经开始二次感染了山东济南seo整站优化公司
  • 做网站会提供源代码吗搜索百度
  • 最差网站设计网站搜索工具
  • 重庆欧勒精细陶瓷有限公司网站策划书廊坊seo整站优化
  • 用几个域名做网站好哪家网站优化公司好
  • 佛山做网站公司有哪些建站seo推广
  • 58黄页网推广效果怎样湖南关键词优化推荐
  • phpcms 怎么做网站拼多多代运营公司十大排名
  • 网站外链怎么做如何做好平台推广
  • 谷歌镜像网站怎么做珠海seo排名收费
  • 捡个杀手做老婆全集免费网站北京网站建设制作公司
  • 广东网站建设开发3seo
  • 博物馆网站建设经费请示合肥网站快速排名提升
  • 适合女生的长久职业seo薪酬
  • 为什么要建设就业指导网站本周国内重大新闻十条
  • 网站的建设与管理系统怎么做好网络营销推广
  • 政府网站 建设汇报东莞做一个企业网站
  • 征婚网站上拉业务做恒指期货域名seo站长工具
  • 政府网站建设服务淘宝宝贝关键词排名查询工具
  • 找个兼职做网站的广州网站优化公司排名
  • 信阳网站建设免费放单平台无需垫付
  • 百度卖货平台云seo