Gson源码之泛型、反射、注解,序列化与反序列化(Fastjson,Protocol Buffers)等

> gson源码- https://github.com/google/gson
Gson源码分析之Json结构抽象和注解使用,泛型,Gson关于反射。数据序列化Parcelable、Serializable
Gson序列化(Object--->JsonString)和反序列化(JsonString--->Object);

-- Gson泛型的一些函数:
1.getOwnerType: 代表拥有者类型,比如你的类型是一个内部类,那么这个Type就指向的是你外部类的类型
2.getRawType : 指向泛型的最外部的类型,比如List<User>指向的就是List类型
3.getGenericComponentType : 指向数组成员类型
4.Gson中将Array类型的Class也归纳为GenericArrayTypeImpl类型
5.getEnclosingClass: 获得外部类
-- Gson 源码分析- https://blog.csdn.net/u012422440/article/details/48860893

涉及的Gson中范型和反射的;反射部分的精髓,主要的就是TypeToken和TypeAdapter

TypeToken<T> typeToken = (TypeToken<T>) TypeToken.get(typeOfT);

TypeAdapter<T> typeAdapter = getAdapter(typeToken);

-- Gson&FastJson解析异常Json的处理- https://blog.csdn.net/james_liao3/article/details/71216047

> Fastjson源码- https://github.com/alibaba/fastjson  (注解与asm )
Fastjson内幕- http://wenshao.iteye.com/blog/1142031/
一、Fastjson中Serialzie的优化实现 
1、自行编写类似StringBuilder的工具类SerializeWriter。
2、使用ThreadLocal来缓存buf。 
3、使用asm避免反射
4、使用一个特殊的IdentityHashMap优化性能。
5、缺省启用sort field输出 
6、集成jdk实现的一些优化算法 
二、fastjson的deserializer的主要优化算法 
1、读取token基于预测。
2、sort field fast match算法 
3、使用asm避免反射 
4、对utf-8的json bytes,针对性使用优化的版本来转换编码。 

5、symbolTable算法。

> Protocol Buffers(数据交互,IM中进行数据通信)
Protocol Buffers - Google's data interchange format- https://github.com/google/protobuf
Android下使用Protobuf进行序列化- https://blog.csdn.net/duanbokan/article/details/51029240
GoogleProtoBuf Jar文件- https://download.csdn.net/download/duanbokan/9478313
利用Android Studio将Protobuf文件生成Java文件- https://www.jianshu.com/p/3a543757d086

Protobuf Plugin for Gradle- https://github.com/google/protobuf-gradle-plugin

> 反射机制

-- Java:一步步带你深入了解神秘的Java反射机制- https://blog.csdn.net/carson_ho/article/details/80921333
 反射属于动态编译
编译方式说明: 
1. 静态编译:在编译时确定类型 & 绑定对象。如常见的使用new关键字创建对象 
2. 动态编译:运行时确定类型 & 绑定对象。动态编译体现了Java的灵活性、多态特性 & 降低类之间的藕合性

 -- Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。Java的反射机制是在编译时并不确定是哪个类被加载了,而是在程序运行的时候才加载。使用的是在编译期并不知道的类。这样的编译特点就是java反射。
 -- java中的Class三种获取方式
1.利用对象调用getClass()方法获取该对象的Class实例;
2.使用Class类的静态方法forName(),用类的名字获取一个Class实例 ;
3.运用.class的方式来获取Class实例,对于基本数据类型的封装类,还可以采用.TYPE来获取相对应的基本数据类型的Class实例;
 -- Java反射机制是指在运行状态中
对于任意一个类,都能知道这个类的所有属性和方法; 
对于任何一个对象,都能够调用它的任何一个方法和属性;
这样动态获取新的以及动态调用对象方法的功能就叫做反射。

public static void reflect(String[] args) {
    try {
        Class<?> cls=Class.forName("test.Person");//加载Person类
        Object object=(Object) cls.newInstance();//实例化Person
        Method setname=cls.getDeclaredMethod("setName", String.class);//获取setName()方法
        setname.invoke(object, "Lipt0n");//设置调用setName的对象和传入setName的值
        Method getname=cls.getDeclaredMethod("getName");//获取getName方法
        System.out.print(getname.invoke(object, null));//设置调用getName方法的对象.把值打印到控制台

    } catch (Exception e) {
        e.printStackTrace();
    }
}

阅读更多
个人分类: 热点(hot)技术
上一篇自定义Udp/Tcp协议/通信协议Socket,IM粘包、分包解决等(2)
下一篇字节码框架ASM与AOP,ASM与BufferKnife/FastJSON
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭