1.[译]Kotlin的源码独门秘籍Reified实化类型参数(上篇)
2.gson是什么牌子
3.探索Android开源框架 - 8. Gson使用及源码解析
4.Android架构师网络访问框架之Retrofit使用详细解析
5.自己想做个app都需要学什么?
6.å享javaç¥è¯ä»ä¹å¥½
[译]Kotlin的独门秘籍Reified实化类型参数(上篇)
本篇已经是 Kotlin 泛型系列第三篇,我们回顾一下前面两篇:第一篇讲的源码是泛型中的类型形参和类型实参,第二篇讨论了什么时候该使用类型形参约束。源码今天,源码我们将探讨Kotlin中独有的源码一种泛型特性——实化类型参数(Reified Type Parameters)。
历史背景:泛型在 Java 中于 JDK1.5 版本引入,源码北风网Java源码而集合 Collection 在 JDK1.2 版本就已经存在,源码后来加入了泛型版本的源码 List。在泛型出现之前,源码我们使用原生态的源码 List 表示。由于泛型擦除的源码存在,无论使用 List 还是源码 List,它们在运行时都表现为 List 类型,源码泛型信息在编译阶段被抹去。源码伪泛型虽然存在,源码但它在运行时并未保持泛型特性。与之相对,C# 采用的是真泛型,没有泛型擦除问题。Kotlin 虽然力求与 Java 互操作性,但也使用了伪泛型,存在泛型擦除。不过,Kotlin 提供了实化类型参数这一特性,让运行时依然能获取到泛型的citra源码具体类型。
实化类型参数适用于函数(或具有 get() 函数的扩展属性),且仅限于声明为 inline 内联的函数。当函数被标记为 inline 时,编译器会在每次调用处插入函数的字节码实现,从而在调用时获取具体实际类型信息。这正是实化类型参数的工作原理。
让我们举例说明在哪些场景中应该使用泛型类型参数引用而不是真实的类名。通常情况下,当我们在源码中编写类名时,案例 1-5 是可以使用类型参数(如 T)替代 Thing 类的场景。对于案例 6-,如果要将类型参数(如 T)替换为具体类名(如 Thing 或 ExceptionalThing),最终会导致编译器错误。
让我们详细看看实化类型参数的实际应用。以一个 User 类为例,假设我们想要反序列化一个 JSON 字符串。在 Java 的序列化库(如 Gson)中,通常需要将 Class 对象作为参数传递,以便知道想要的类型。使用实化类型参数,我们可以创建一个包装 Gson 方法的轻量级扩展函数:
通过这种方式,我们可以在 Kotlin 代码中反序列化 JSON 字符串,而无需传递类型信息。Kotlin 会根据其使用方式推断出类型,rocketdb源码例如将结果分配给 User 类型的变量时,它会使用此类型作为 fromJson() 的类型参数。这样不仅简化了代码,还避免了在不同场景中重复传递类型信息的繁琐。
实化类型参数的使用场景还包括:简化序列化与反序列化过程、避免繁琐的类型信息传递、以及利用类型推断优化代码结构。Kotlin 的这一特性使得泛型使用更加灵活,提高了代码的可读性和效率。
接下来,下篇译文将深入探讨实化类型参数,敬请期待。如果您对 Kotlin 技术感兴趣,欢迎加入 Kotlin 开发者联盟,获取最新技术文章和社区资源。
gson是什么牌子
Gson不是一个牌子,而是一个由Google提供的Java类库。
Gson,全称Google Gson,是一个用于在Java对象和JSON数据之间进行映射的开放源代码库。它允许开发者轻松地将Java对象序列化为JSON字符串,或者将JSON字符串反序列化为Java对象。这一功能在处理数据交换、存储或网络传输时特别有用,源码加减因为JSON是一种轻量级的数据交换格式,既易于人类阅读和编写,也易于机器解析和生成。
Gson库的主要特点包括其高效快速的处理能力、简洁的代码实现、面向对象的设计,以及方便的数据传递和解析机制。通过Gson,开发者可以简洁地将复杂的Java对象转换为JSON格式的字符串,或者将JSON字符串解析回Java对象,这在Web服务和API交互中特别重要。
举个例子,如果你有一个包含用户信息的Java对象,比如用户名和年龄,你可以使用Gson库轻松地将这个对象转换为一个JSON字符串,如`{ "name":"张三", "age":}`。同样地,如果你从Web服务接收到一个JSON格式的响应,你也可以使用Gson将其解析为一个Java对象,从而方便地在你的应用程序中使用这些数据。
总的来说,Gson是一个非常实用的工具,它大大简化了Java应用程序中处理JSON数据的复杂性。
探索Android开源框架 - 8. Gson使用及源码解析
深入解析Android开源框架中的superscan源码Gson使用及其源码解析,Gson作为Java语言的高效JSON转换库,以其简洁的API和高性能的特点,成为Android开发中进行数据序列化和反序列化的首选工具。本文将详细介绍Gson的使用方法,包括基本的解析与生成、属性重命名、POJO与JSON的字段映射规则、泛型的封装、序列化与反序列化过程,以及如何进行字段过滤与自定义序列化器和反序列化器的实现。
1. **基本的解析与生成
**使用Gson进行JSON字符串解析时,可以通过Gson对象的fromJson方法将JSON字符串转换为Java对象,反之,使用toJson方法将Java对象转换为JSON字符串。
2. **属性重命名
**通过使用@SerializedName注解,可以方便地在POJO类中重命名JSON字段,以匹配服务端返回的数据结构,从而避免硬编码的字符串匹配。
3. **POJO与JSON的字段映射规则
**Gson通过构建一个映射规则来匹配JSON字段到POJO类的属性,确保数据的正确解析与生成。这主要通过类型适配器(TypeAdapter)来实现,使得Gson能够理解如何处理复杂数据类型,如日期、集合等。
4. **泛型的封装
**在使用Gson进行序列化和反序列化时,可以通过泛型来保证类型安全,确保不会出现类型转换错误。GsonBuilder提供了一系列方法来实现泛型的封装,使得API调用更为清晰和明确。
5. **Gson的序列化、反序列化
**通过Gson的API,可以轻松实现Java对象到JSON字符串的序列化,以及从JSON字符串反序列化到Java对象的过程。这使得数据在不同系统间传输变得简单高效。
6. **字段过滤
**提供了多种方法进行字段过滤,如使用@Expose注解、基于版本的过滤、访问修饰符、以及基于策略的自定义过滤规则,以满足不同的数据处理需求。
7. **TypeAdapter、JsonSerializer与JsonDeserializer
**实战中,可能需要处理一些特殊的数据类型或复杂逻辑,这时可以通过实现JsonSerializer或JsonDeserializer来自定义序列化和反序列化过程。TypeAdapter则可以用于处理复杂类型的序列化。
8. **实战TypeAdapterFactory
**在某些场景下,可以通过实现TypeAdapterFactory来创建自定义的TypeAdapter,从而实现更为灵活的数据处理逻辑。
9. **@JsonAdapter注解
**用于指定自定义的序列化器或反序列化器,简化了实现自定义序列化逻辑的步骤,使得代码更为简洁和易读。
. **源码解析
**通过深入源码分析,可以更好地理解Gson内部的实现机制,如fromJson方法如何获取适配器、getAdapter方法如何选择适配器、Gson的构造方法如何初始化适配器列表,以及如何通过反射机制创建绑定字段等关键逻辑。这不仅有助于解决实际开发中的问题,还能加深对Gson工作的理解,为后续的优化和定制提供基础。
Android架构师网络访问框架之Retrofit使用详细解析
Retrofit在Android开发中是常用的网络访问框架,它由Square开发,基于Java,提供类型安全的HTTP客户端。
Retrofit简化了在Android应用中的RESTful API请求过程,通过注解定义API端点和参数,使得开发者轻松创建和管理API请求。支持JSON、XML等数据格式,并自动使用如Gson或Jackson进行序列化。
Retrofit支持异步处理API调用,通过回调或RxJava Observables实现,避免阻塞主线程的UI操作。
Retrofit核心模块包含关键组件,其他辅助模块用于处理拦截器、请求头和参数等特定功能。源码结构清晰,易于理解和扩展。
Retrofit使用解析如下:
定义接口和处理响应结果即可,无需关注底层网络请求和数据解析。提供简洁API和丰富功能,简化网络请求开发。
可添加Gson转换器、RxJava适配器等依赖。更多网络学习参考《Android核心技术手册》。
Retrofit强大,简化网络请求,提高开发效率。封装请求逻辑,提高代码可维护性和复用性。利用注解、数据转换器等功能灵活处理不同需求。
综上,善用Retrofit技术,能高效进行网络请求开发。
自己想做个app都需要学什么?
快速学会制作app的建议:
1、首先可以写一些简单功能的无UI的java程序,熟悉java基本语法,基本数据类型,常用类;理解继承机制等。
2、再次可以看一些Android的入门书籍,重点了解:Activity的生命周期;常用Layout及各类View的构建;能写一些简单的demo来使用这些控件。
3、如果要有内容发布功能,就意味着需要在客户端进行网络访问和数据传输,这时就需要稍微了解http协议,数据传输格式建议使用json;在Android客户端的开发中有一些第三方组件可以帮助你完成网络访问和数据解析,建议:android async http以及gson,你可以在github上查找这些组件;使用这些组件避免了你自造轮子,节省时间,但可能会阻碍你了解到一些技术细节(例如多线程,json解析方式),这点初学者可自行权衡。
4、如果你需要写一个服务器端,建议使用php+mysql来实现web service,容易上手;你可能也需要了解一些对象关系数据库的基本概念和原理,一些基本的sql语法;试着建立你的数据库表,编写sql语句来查询你想要的数据;然后编写php代码来连接并操作你的数据库,并将结果以json形式返回;如果想用java来完成服务器端,也是可以的,j2ee+jsp也可胜任。
5、极客营讲师觉得在学会以上之后你就可以着手设计开发你的App了,极客营提醒良好的代码结构和风格比学会某些sdk要重要的多,各位同学应该从一开始就养成良好的习惯。极客营讲师都会要求极客营学生做到的一点。
如果你只是利用业余时间去开发制作app,可以走以上步骤,但是极客营觉得如果要真正的从事app开发工作,这个必须要从计算机基础开始学起,去参加一些app培训学校或者找一个会做app的老手带你从基础学起,因为如果想进入IT行业是需要多年的基础技术累积。
å享javaç¥è¯ä»ä¹å¥½
1.å¤çº¿ç¨å¹¶å
å¤çº¿ç¨æ¯Javaä¸æ®é认为æ¯è¾é¾çä¸åãå¤çº¿ç¨ç¨å¥½äºå¯ä»¥æææé«cpu使ç¨çï¼ æåæ´ä½ç³»ç»æçï¼ ç¹å«æ¯å¨æ大éIOæä½é»å¡çæ åµä¸;ä½æ¯å®ä¹æ¯ä¸æåååï¼ å¦æç¨ä¸å¥½ï¼ç³»ç»éä½æåä¸å¤§ï¼æè 没ææåï¼èä¸è¿ä¼å¸¦æ¥å¤çº¿ç¨ä¹é´çè°è¯æ¶çé®é¢ã
å¨å¤çº¿ç¨ä¸å 容æå¾å¤ï¼åªæ¯ç®å说æä¸ä¸Javaä¸åæ¥ä½¿ç¨å¤çº¿ç¨éè¦ææ¡çç¥è¯ç¹ï¼ä»¥åææºä¼åç¬å详ç»ä»ç»ä¸äºé«çº§ç¹æ§ç使ç¨åºæ¯ã
å¤çº¿ç¨çå®ç°åå¯å¨
callable ä¸ runable åºå«
syncrhoized ï¼reentrantLock åèªç¹ç¹åæ¯å¯¹
线ç¨æ±
future å¼æ¥æ¹å¼è·åæ§è¡ç»æ
concurrent å
lock
2.ç½ç»
Java ä¸ä¹æ¯æä¾äºå¯ä»¥ç´æ¥æä½ TCPåè®®ãUDPåè®®çAPIãå¨éè¦å¼ºè°ç½ç»æ§è½çæ åµä¸ï¼å¯ä»¥ç´æ¥ä½¿ç¨TCP/UDP è¿è¡é讯ãå¨æ¥çTomcatççæºç ä¸ï¼å°±å¯ä»¥çå°è¿äºç¸å ³APIç使ç¨æ åµãä¸è¿ä¸è¬ä¹æ¯è¾å°ä¼ç´æ¥ä½¿ç¨TCPï¼ä¼ä½¿ç¨è¯¸å¦MINAãNettyè¿æ · çæ¡æ¶æ¥è¿è¡å¤çï¼å 为è¿ä¸ªæ¹é¢çå¼åæ¶åä¸å¤ï¼æ以就ä¸å详ç»ç½åäºã
3.æ¶é´æ¥æå¤ç
å ä¹å¯¹äºæ¯ä¸ªåºç¨æ¥è¯´ï¼æ¶é´æ¥æçå¤çä¹æ¯ç»ä¸è¿å»çï¼ä½æ¯JDK8 ä¹åçæ¶é´ç¸å ³APIç¨æ³å¹¶ä¸å好ãå¨é£ä¸ªæ¶ä»£ï¼å¯ä»¥éæ©Jodaçæ¶é´æ¡æ¶ãå°äºJDK8 åå¸ä¹åï¼å ¨æ°çæ¶é´APIåºæ¬èåäºå ¶ä»æ¡æ¶çä¼ç¹ï¼å·²ç»å¯ä»¥å¾å¥½çç´æ¥ä½¿ç¨äºã
对äºJavaå¼åè æ¥è¯´ï¼éè¦çç»å°ä½¿ç¨APIæ¥å¯¹æ¶é´åæ¥æåç¸å ³çå¤çã
å ·ä½ç¥è¯ç¹ä¸åç½åï¼ä¼å¨ä»¥ååå个ä¸é¨çæç« æ¥æ»ç»ä¸ä¸JDK8ä¸æ¶é´æ¥æAPIçç¨æ³
4.XML解æ/ JSON解æ
å ¶å®è¿ä¸¤åå 容é½ä¸æ¯J2SEéé¢çå 容ï¼ä½æ¯å¨æ¥å¸¸å¼åä¸ï¼åå ¶ä»ç¨åºäº¤äºï¼åé ç½®æ件交äºï¼è¶æ¥è¶ç¦»ä¸å¼è¿ä¸¤ç§æ ¼å¼ç解æã
ä¸è¿å¯¹äºä¸ä¸ªå¼åè æ¥è¯´ï¼è½å¤äºè§£ä¸äºXML/JSONå ·ä½è§£æçåçåæ¹æ³ï¼æå©äºä½ å¨åä¸ªå ·ä½çåºæ¯ä¸æ´å¥½çéæ©åéä½ çæ¹å¼æ¥ä½¿å¾ä½ çç¨åºæ´ææçåæ´å å¥å£®ã
XMLï¼ éè¦äºè§£ DOM解æå SAX解æçåºæ¬åçååèªçéç¨åºæ¯
JSONï¼ éè¦äºè§£ä¸äºå¸¸ç¨JSONæ¡æ¶çç¨æ³ï¼ å¦ Jacksonï¼ FastJsonï¼ Gson çã
5.Mavenç使ç¨
Maven ä¹ä¸æ¯Javaéé¢çå 容ï¼ä½æ¯mavenæ¯é©å½æ§çï¼ç»javaå¼å带æ¥äºå·¨å¤§ç便å©ãä»ä¾èµçå¼å ¥å管çï¼å¼åæµç¨çæ´æ°ååå¸äº§åºï¼ä¹è³çæ¬çæ´ æ°ï¼ä½¿ç¨mavenå¯ä»¥å¤§å¤§ç®åå¼åè¿ç¨ä¸çå¤æ度ï¼ä»èèç大éæ¶é´ãå¯ä»¥è¯´ï¼mavenå·²ç»æ为javaå¼åè çæ é äºãæ以ææmavenä¹ä½ä¸ºä¸ 个javaå¼åè 对äºåºç¡å¿ å¤çç¥è¯ç¹ã以åä¼åæ¾ä¸ä¸äºæçä¸äºå¯¹äºmaven使ç¨çç»éªåæå·§çï¼è¿éå°±ä¸åç»è¯´äºã
6.æ³å
è¿æ¯JDK5å¼å§å¼å ¥çæ°æ¦å¿µï¼å ¶å®æ¯ä¸ªè¯æ³ç³ï¼å¨ç¼åjava代ç æ¶ä¼æäºè®¸ä¾¿å©ï¼ ä¸è¬çåºç¨æè æ¯ä¸å¡çå¼åï¼åªéè¦ç®å使ç¨ï¼ä¸ä¸å®ä¼ç¨å°å®ä¹æ³åè¿æ ·çæä½ï¼ ä½æ¯å¼åä¸äºåºç¡å ¬å ±ç»ä»¶ä¼ä½¿ç¨å°ï¼å¯ä»¥å¨éè¦çæ¶ååç»çè¿ä¸ªé¨åï¼ä¸è¬æ åµä¸åªè¦ä¼ç®å使ç¨å³å¯ãç°å¨å¾å¤ä¼ä¼´æ³å¦ä¹ ç¼ç¨ï¼ä½å¦ä¹ çè¿ç¨æ¯ç¥åè¿·è«ï¼ä¸ç¥éæä¹å¦ï¼ç»æ³è¦å¦ä¹ Javaçä¼ä¼´æ¨èä¸ä¸ªå¦ä¹ çå°æ¹ï¼æ¯å¤©æä¸å¨çº¿ç´ææå¦ãå¦ä¹ Javaç群ï¼ä¸ä¸å ï¼å «é¶åï¼äºé¶å «ï¼ä¸æ¯å¦ä¹ çå°±ä¸è¦å å ¥äºã
7.æ 注
ä¹æ¯jdk5 ä¹åå¼å ¥çãSpringæ¯ä¸ªä¼ç§çæ¡æ¶ï¼æå¼å§å°±ä»¥xmlä½ä¸ºæ åçé ç½®æ件ãä¸è¿å°äºSpring3 ä¹åï¼å°¤å ¶æ¯ spring-boot å ´èµ·ä¹åï¼è¶æ¥è¶æ¨å´ä½¿ç¨æ 注æ¥ç®åxmlé ç½®æ件äºï¼å¯¹äºå¼åè æ¥è¯´ï¼å¯ä»¥èçä¸å°xmlé ç½®çæ¶é´ãä½æ¯å£å¿æ¯å¨äºæ 注æ£è½å¨å个类ä¸ï¼ä¸åxmlï¼ å¯ä»¥å¯¹ææé ç½®æä¸ªå ¨å±æ§çç解å管çï¼æ以è¿æ²¡æåæ³è¯´å®å ¨å°±å代ææçxmlã对äºä¸è¬å¼åè ï¼ä¼ä½¿ç¨æ 注å³å¯ï¼ä¸äºå ¬å ±ç»å»ºçå¼åè å¯è½ä¼éè¦äºè§£ æ 注çå®ä¹åå®ç°ï¼å¯ä»¥å¨å ·ä½éè¦çæ¶ååç»çã
8.RMI
RemoteMethodInvocation ï¼Javaè¯è¨ç¹æçè¿ç¨è°ç¨æ¥å£ï¼ä½¿ç¨è¿æ¯æ¯è¾ç®åæ¹ä¾¿ãä¸è¿éè¦è·¨è¯è¨çæ åµä¸ï¼å°±éè¦ä½¿ç¨ webservice çå ¶ä»æ¹å¼æ¥æ¯æãä¸è¬æ¥è¯´ï¼ç¨åºé½ä¸éè¦ä½¿ç¨RMIï¼ä¸è¿å¯ä»¥å¨ç¹å®çæ åµä¸ä½¿ç¨ï¼æå°±å¨ä¸ä¸ªé¡¹ç®ä¸ï¼ä½¿ç¨RMIæ¥è¿è¡ç¨åºè¿ç¨å¯å¨åæ¢çæ§å¶ã
9.JNI
Java Native Interfaceï¼å¯ä»¥å 许Javaä¸è°ç¨æ¬å°æ¥å£æ¹æ³ï¼ä¸è¬ç¨äºC/C++代ç çè°ç¨ãéè¦æ³¨æçæ¯å¨javaä¸å è½½so/dllæ件çè·¯å¾é®é¢ï¼æ¬èº«è°ç¨æ¥å£å¹¶ä¸å¤æï¼ä½æ¯ç»å¸¸å¨æ¯å¦å è½½äºæéçæ¬å°æ¥å£åºä¸è±è´¹è¾å¤æ¶é´ã