1. 程式人生 > >protoc編譯proto檔案之Java原始碼結構分析一(addr.proto)

protoc編譯proto檔案之Java原始碼結構分析一(addr.proto)

一、addr.proto

option java_package = "com.test.protocol";
option java_outer_classname = "AddressProto";
message Address {
    optional string province = 1;
    optional string mayor = 2;
}

二、AddressProto.java結構分析

這裡寫圖片描述
如上圖所示,AddressProto.java主要分為三部分:

第一部分:Interface AddressOrBuilder

其中定義瞭如下結構中各 field

getter的介面 方法:

message Address {
    optional string province = 1;
    optional string mayor = 2;
}

getter 介面 方法具體如下:
這裡寫圖片描述

第二部分

這裡是整個AddressProto.java程式碼的核心部分。
概覽如下:
這裡寫圖片描述
這裡寫圖片描述

其中可以分為三個部分:

1、Builder

Builder主要完成以下操作:
(1). 實現Interface AddressOrBuilder 各getter介面方法
(2). 提供 各field的setter方法
(3). Builder自身建構函式。
(4). 建立Address例項的方法。

這裡寫圖片描述

2、實現Interface AddressOrBuilde介面並提供過載版本的parseFrom()方法。

這裡寫圖片描述

3、原型proto檔案中各field

原型proto內容:

message Address {
    optional string province = 1;
    optional string mayor = 2;
}

各field程式碼:
這裡寫圖片描述

第三部分:AddressProto類建立函式等

此部分包含AddressProto類建立函式,獲取檔案描述符等。
這裡寫圖片描述

三、AddressProto.java完整程式碼

// Generated by the protocol buffer compiler.  DO NOT EDIT!
// source: addr.proto
package com.test.protocol; public final class AddressProto { private AddressProto() {} public static void registerAllExtensions( com.google.protobuf.ExtensionRegistry registry) { } public interface AddressOrBuilder extends com.google.protobuf.MessageOrBuilder { // optional string province = 1; /** * <code>optional string province = 1;</code> */ boolean hasProvince(); /** * <code>optional string province = 1;</code> */ java.lang.String getProvince(); /** * <code>optional string province = 1;</code> */ com.google.protobuf.ByteString getProvinceBytes(); // optional string mayor = 2; /** * <code>optional string mayor = 2;</code> */ boolean hasMayor(); /** * <code>optional string mayor = 2;</code> */ java.lang.String getMayor(); /** * <code>optional string mayor = 2;</code> */ com.google.protobuf.ByteString getMayorBytes(); } /** * Protobuf type {@code Address} */ public static final class Address extends com.google.protobuf.GeneratedMessage implements AddressOrBuilder { // Use Address.newBuilder() to construct. private Address(com.google.protobuf.GeneratedMessage.Builder<?> builder) { super(builder); this.unknownFields = builder.getUnknownFields(); } private Address(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } private static final Address defaultInstance; public static Address getDefaultInstance() { return defaultInstance; } public Address getDefaultInstanceForType() { return defaultInstance; } private final com.google.protobuf.UnknownFieldSet unknownFields; @java.lang.Override public final com.google.protobuf.UnknownFieldSet getUnknownFields() { return this.unknownFields; } private Address( com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { initFields(); int mutable_bitField0_ = 0; com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder(); try { boolean done = false; while (!done) { int tag = input.readTag(); switch (tag) { case 0: done = true; break; default: { if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) { done = true; } break; } case 10: { bitField0_ |= 0x00000001; province_ = input.readBytes(); break; } case 18: { bitField0_ |= 0x00000002; mayor_ = input.readBytes(); break; } } } } catch (com.google.protobuf.InvalidProtocolBufferException e) { throw e.setUnfinishedMessage(this); } catch (java.io.IOException e) { throw new com.google.protobuf.InvalidProtocolBufferException( e.getMessage()).setUnfinishedMessage(this); } finally { this.unknownFields = unknownFields.build(); makeExtensionsImmutable(); } } public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return com.test.protocol.AddressProto.internal_static_Address_descriptor; } protected com.google.protobuf.GeneratedMessage.FieldAccessorTable internalGetFieldAccessorTable() { return com.test.protocol.AddressProto.internal_static_Address_fieldAccessorTable .ensureFieldAccessorsInitialized( com.test.protocol.AddressProto.Address.class, com.test.protocol.AddressProto.Address.Builder.class); } public static com.google.protobuf.Parser<Address> PARSER = new com.google.protobuf.AbstractParser<Address>() { public Address parsePartialFrom( com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { return new Address(input, extensionRegistry); } }; @java.lang.Override public com.google.protobuf.Parser<Address> getParserForType() { return PARSER; } private int bitField0_; // optional string province = 1; public static final int PROVINCE_FIELD_NUMBER = 1; private java.lang.Object province_; /** * <code>optional string province = 1;</code> */ public boolean hasProvince() { return ((bitField0_ & 0x00000001) == 0x00000001); } /** * <code>optional string province = 1;</code> */ public java.lang.String getProvince() { java.lang.Object ref = province_; if (ref instanceof java.lang.String) { return (java.lang.String) ref; } else { com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; java.lang.String s = bs.toStringUtf8(); if (bs.isValidUtf8()) { province_ = s; } return s; } } /** * <code>optional string province = 1;</code> */ public com.google.protobuf.ByteString getProvinceBytes() { java.lang.Object ref = province_; if (ref instanceof java.lang.String) { com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8( (java.lang.String) ref); province_ = b; return b; } else { return (com.google.protobuf.ByteString) ref; } } // optional string mayor = 2; public static final int MAYOR_FIELD_NUMBER = 2; private java.lang.Object mayor_; /** * <code>optional string mayor = 2;</code> */ public boolean hasMayor() { return ((bitField0_ & 0x00000002) == 0x00000002); } /** * <code>optional string mayor = 2;</code> */ public java.lang.String getMayor() { java.lang.Object ref = mayor_; if (ref instanceof java.lang.String) { return (java.lang.String) ref; } else { com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; java.lang.String s = bs.toStringUtf8(); if (bs.isValidUtf8()) { mayor_ = s; } return s; } } /** * <code>optional string mayor = 2;</code> */ public com.google.protobuf.ByteString getMayorBytes() { java.lang.Object ref = mayor_; if (ref instanceof java.lang.String) { com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8( (java.lang.String) ref); mayor_ = b; return b; } else { return (com.google.protobuf.ByteString) ref; } } private void initFields() { province_ = ""; mayor_ = ""; } private byte memoizedIsInitialized = -1; public final boolean isInitialized() { byte isInitialized = memoizedIsInitialized; if (isInitialized != -1) return isInitialized == 1; memoizedIsInitialized = 1; return true; } public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { getSerializedSize(); if (((bitField0_ & 0x00000001) == 0x00000001)) { output.writeBytes(1, getProvinceBytes()); } if (((bitField0_ & 0x00000002) == 0x00000002)) { output.writeBytes(2, getMayorBytes()); } getUnknownFields().writeTo(output); } private int memoizedSerializedSize = -1; public int getSerializedSize() { int size = memoizedSerializedSize; if (size != -1) return size; size = 0; if (((bitField0_ & 0x00000001) == 0x00000001)) { size += com.google.protobuf.CodedOutputStream .computeBytesSize(1, getProvinceBytes()); } if (((bitField0_ & 0x00000002) == 0x00000002)) { size += com.google.protobuf.CodedOutputStream .computeBytesSize(2, getMayorBytes()); } size += getUnknownFields().getSerializedSize(); memoizedSerializedSize = size; return size; } private static final long serialVersionUID = 0L; @java.lang.Override protected java.lang.Object writeReplace() throws java.io.ObjectStreamException { return super.writeReplace(); } public static com.test.protocol.AddressProto.Address parseFrom( com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data); } public static com.test.protocol.AddressProto.Address parseFrom( com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data, extensionRegistry); } public static com.test.protocol.AddressProto.Address parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data); } public static com.test.protocol.AddressProto.Address parseFrom( byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data, extensionRegistry); } public static com.test.protocol.AddressProto.Address parseFrom(java.io.InputStream input) throws java.io.IOException { return PARSER.parseFrom(input); } public static com.test.protocol.AddressProto.Address parseFrom( java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { return PARSER.parseFrom(input, extensionRegistry); } public static com.test.protocol.AddressProto.Address parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException { return PARSER.parseDelimitedFrom(input); } public static com.test.protocol.AddressProto.Address parseDelimitedFrom( java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { return PARSER.parseDelimitedFrom(input, extensionRegistry); } public static com.test.protocol.AddressProto.Address parseFrom( com.google.protobuf.CodedInputStream input) throws java.io.IOException { return PARSER.parseFrom(input); } public static com.test.protocol.AddressProto.Address parseFrom( com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { return PARSER.parseFrom(input, extensionRegistry); } public static Builder newBuilder() { return Builder.create(); } public Builder newBuilderForType() { return newBuilder(); } public static Builder newBuilder(com.test.protocol.AddressProto.Address prototype) { return newBuilder().mergeFrom(prototype); } public Builder toBuilder() { return newBuilder(this); } @java.lang.Override protected Builder newBuilderForType( com.google.protobuf.GeneratedMessage.BuilderParent parent) { Builder builder = new Builder(parent); return builder; } /** * Protobuf type {@code Address} */ public static final class Builder extends com.google.protobuf.GeneratedMessage.Builder<Builder> implements com.test.protocol.AddressProto.AddressOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return com.test.protocol.AddressProto.internal_static_Address_descriptor; } protected com.google.protobuf.GeneratedMessage.FieldAccessorTable internalGetFieldAccessorTable() { return com.test.protocol.AddressProto.internal_static_Address_fieldAccessorTable .ensureFieldAccessorsInitialized( com.test.protocol.AddressProto.Address.class, com.test.protocol.AddressProto.Address.Builder.class); } // Construct using com.test.protocol.AddressProto.Address.newBuilder() private Builder() { maybeForceBuilderInitialization(); } private Builder( com.google.protobuf.GeneratedMessage.BuilderParent parent) { super(parent); maybeForceBuilderInitialization(); } private void maybeForceBuilderInitialization() { if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { } } private static Builder create() { return new Builder(); } public Builder clear() { super.clear(); province_ = ""; bitField0_ = (bitField0_ & ~0x00000001); mayor_ = ""; bitField0_ = (bitField0_ & ~0x00000002); return this; } public Builder clone() { return create().mergeFrom(buildPartial()); } public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { return com.test.protocol.AddressProto.internal_static_Address_descriptor; } public com.test.protocol.AddressProto.Address getDefaultInstanceForType() { return com.test.protocol.AddressProto.Address.getDefaultInstance(); } public com.test.protocol.AddressProto.Address build() { com.test.protocol.AddressProto.Address result = buildPartial(); if (!result.isInitialized()) { throw newUninitializedMessageException(result); } return result; } public com.test.protocol.AddressProto.Address buildPartial() { com.test.protocol.AddressProto.Address result = new com.test.protocol.AddressProto.Address(this); int from_bitField0_ = bitField0_; int to_bitField0_ = 0; if (((from_bitField0_ & 0x00000001) == 0x00000001)) { to_bitField0_ |= 0x00000001; } result.province_ = province_; if (((from_bitField0_ & 0x00000002) == 0x00000002)) { to_bitField0_ |= 0x00000002; } result.mayor_ = mayor_; result.bitField0_ = to_bitField0_; onBuilt(); return result; } public Builder mergeFrom(com.google.protobuf.Message other) { if (other instanceof com.test.protocol.AddressProto.Address) { return mergeFrom((com.test.protocol.AddressProto.Address)other); } else { super.mergeFrom(other); return this; } } public Builder mergeFrom(com.test.protocol.AddressProto.Address other) { if (other == com.test.protocol.AddressProto.Address.getDefaultInstance()) return this; if (other.hasProvince()) { bitField0_ |= 0x00000001; province_ = other.province_; onChanged(); } if (other.hasMayor()) { bitField0_ |= 0x00000002; mayor_ = other.mayor_; onChanged(); } this.mergeUnknownFields(other.getUnknownFields()); return this; } public final boolean isInitialized() { return true; } public Builder mergeFrom( com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { com.test.protocol.AddressProto.Address parsedMessage = null; try { parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); } catch (com.google.protobuf.InvalidProtocolBufferException e) { parsedMessage = (com.test.protocol.AddressProto.Address) e.getUnfinishedMessage(); throw e; } finally { if (parsedMessage != null) { mergeFrom(parsedMessage); } } return this; } private int bitField0_; // optional string province = 1; private java.lang.Object province_ = ""; /** * <code>optional string province = 1;</code> */ public boolean hasProvince() { return ((bitField0_ & 0x00000001) == 0x00000001); } /** * <code>optional string province = 1;</code> */ public java.lang.String getProvince() { java.lang.Object ref = province_; if (!(ref instanceof java.lang.String)) { java.lang.String s = ((com.google.protobuf.ByteString) ref) .toStringUtf8(); province_ = s; return s; } else { return (java.lang.String) ref; } } /** * <code>optional string province = 1;</code> */ public com.google.protobuf.ByteString getProvinceBytes() { java.lang.Object ref = province_; if (ref instanceof String) { com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8( (java.lang.String) ref); province_ = b; return b; } else { return (com.google.protobuf.ByteString) ref; } } /** * <code>optional string province = 1;</code> */ public Builder setProvince( java.lang.String value) { if (value == null) { throw new NullPointerException(); } bitField0_ |= 0x00000001; province_ = value; onChanged(); return this; } /** * <code>optional string province = 1;</code> */ public Builder clearProvince() { bitField0_ = (bitField0_ & ~0x00000001); province_ = getDefaultInstance().getProvince(); onChanged(); return this; } /** * <code>optional string province = 1;</code> */ public Builder setProvinceBytes( com.google.protobuf.ByteString value) { if (value == null) { throw new NullPointerException(); } bitField0_ |= 0x00000001; province_ = value; onChanged(); return this; } // optional string mayor = 2; private java.lang.Object mayor_ = ""; /** * <code>optional string mayor = 2;</code> */ public boolean hasMayor() { return ((bitField0_ & 0x00000002) == 0x00000002); } /** * <code>optional string mayor = 2;</code> */ public java.lang.String getMayor() { java.lang.Object ref = mayor_; if (!(ref instanceof java.lang.String)) { java.lang.String s = ((com.google.protobuf.ByteString) ref) .toStringUtf8(); mayor_ = s; return s; } else { return (java.lang.String) ref; } } /** * <code>optional string mayor = 2;</code> */ public com.google.protobuf.ByteString getMayorBytes() { java.lang.Object ref = mayor_; if (ref instanceof String) { com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8( (java.lang.String) ref); mayor_ = b; return b; } else { return (com.google.protobuf.ByteString) ref; } } /** * <code>optional string mayor = 2;</code> */ public Builder setMayor( java.lang.String value) { if (value == null) { throw new NullPointerException(); } bitField0_ |= 0x00000002; mayor_ = value; onChanged(); return this; } /** * <code>optional string mayor = 2;</code> */ public Builder clearMayor() { bitField0_ = (bitField0_ & ~0x00000002); mayor_ = getDefaultInstance().getMayor(); onChanged(); return this; } /** * <code>optional string mayor = 2;</code> */ public Builder setMayorBytes( com.google.protobuf.ByteString value) { if (value == null) { throw new NullPointerException(); } bitField0_ |= 0x00000002; mayor_ = value; onChanged(); return this; } // @@protoc_insertion_point(builder_scope:Address) } static { defaultInstance = new Address(true); defaultInstance.initFields(); } // @@protoc_insertion_point(class_scope:Address) } private static com.google.protobuf.Descriptors.Descriptor internal_static_Address_descriptor; private static com.google.protobuf.GeneratedMessage.FieldAccessorTable internal_static_Address_fieldAccessorTable; public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() { return descriptor; } private static com.google.protobuf.Descriptors.FileDescriptor descriptor; static { java.lang.String[] descriptorData = { "\n\naddr.proto\"*\n\007Address\022\020\n\010province\030\001 \001(" + "\t\022\r\n\005mayor\030\002 \001(\tB!\n\021com.test.protocolB\014A" + "ddressProto" }; com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { public com.google.protobuf.ExtensionRegistry assignDescriptors( com.google.protobuf.Descriptors.FileDescriptor root) { descriptor = root; internal_static_Address_descriptor = getDescriptor().getMessageTypes().get(0); internal_static_Address_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_Address_descriptor, new java.lang.String[] { "Province", "Mayor", }); return null; } }; com.google.protobuf

相關推薦

protoc編譯proto檔案Java原始碼結構分析addr.proto

一、addr.proto option java_package = "com.test.protocol"; option java_outer_classname = "AddressProto"; message Address { opti

Java資料結構詳解十二- HashMap

HashMap 基於雜湊表的 Map 介面的實現。此實現提供所有可選的對映操作,並允許使用 null 值和 null 鍵。(除了非同步和允許使用 null 之外,HashMap 類與 Hashtable 大致相同。)此類不保證對映的順序,特別是它不保證該順序恆

JAVA設計模式【代理模式】靜態代理

代理模式 代理模式是物件的結構模式,給一個物件提供一個代理物件,由代理物件控制對原物件的引用。我們可以通過操作代理物件實現對原物件的呼叫。 本文主要講述靜態代理,jdk動態代理,cglib動態代理三種。 代理的種類 - 遠端(Remo

資料探勘關聯分析基本概念

許多商業企業運營中的大量資料,通常稱為購物籃事務(market basket transaction)。表中每一行對應一個事務,包含一個唯一標識TID。 利用關聯分析的方法可以發現聯絡如關聯規則或頻繁項集。 關聯分析需要處理的關鍵問題: 1. 從大型事

Google PB協議學習記錄--一個簡單的例子--如何編譯.proto檔案為.java檔案

步驟一, 書寫 .proto 檔案,這裡直接上google官方例項,並存儲為addressbook.proto package tutorial; option java_package = "com.example.tutorial"; option java_o

Java記憶體管理Java結構是怎麼樣的?裡面有什麼東西?

文章目錄 1. 剛剛建立的物件 2. 存活了一段時間的物件 3. 永久存在的物件 一塊 Java 堆空間一般分成三部分,這三部分用來儲存三類資料:新生代、老年代、永久代。 1. 剛剛建立的物件 在程式碼執行時會持續不斷地創

Java資料結構和演算法線性結構單鏈表

Java資料結構和演算法(一)線性結構之單鏈表 prev current next -------------- -------------- -------------- | value | next | ->

JVMJava記憶體結構

Java記憶體結構的幾大部分如下圖: 接下來,會對上面每部分割槽域的功能一一解釋。 1、程式計數器:是執行緒私有區,是記憶體中一塊較小的區域,是當前執行緒執行的位元組碼指令的行號指示器,如果執行緒執行的是Java方法,程式計數器記錄的是正在執行的虛擬機器位元組碼指令的地址,如果執行的是native方法

利用編譯時註解生成Java原始碼

我們在編寫註解的時候,需要指定@Retention,有三個可選值,表示註解會被保留到那個階段。 RetentionPolicy.SOURCE       這種型別的Annotations只在原始碼級別保留,編譯時就會被忽略,因此一般用來為編譯器提供額外資訊,以便於檢測錯誤,

Json格式轉 Excel檔案Java原始碼

由於工作中與我們對接的部門不懂技術需要我們將Json格式的資料轉換成Excel文件提供給她們進行資料分析,其實使用到的技術並不複雜就是Apache poi的一個簡單應用,之所以我要分享出來是因為這個工具類比較實用,有相同需求的小夥伴可以直接引入此類配置Json檔案所在的路徑和

Java從入門到放棄十四集合框架TreeMap原始碼

我們經常需要對一些集合按照指定的規則進行排序,比如學生按照學號排序,或者按照成績排序,集合裡面有專門排序的集合,如TreeMap。TreeMap裡面是使用的紅黑樹結構。 構造方法 private final Comparator<? su

深入理解系列JAVA資料結構4——Hashtable

1、Hashtable和HashMap,從儲存結構和實現來講基本上都是相同的, Hashtable繼承自Dictionary類,而HashMap繼承自AbstractMap類,但二者都實現了Map介面。 2、它和HashMap的最大的不同是它是

protobuf通過.proto檔案生成JAVA

首先先下載一個protocbuf(v3.0.0),然後進入到所屬目錄中進行DOM命令操作 protoc.exe --java_out=.  Wenhua.proto如果要給生成的java檔案指定包名

深入理解系列JAVA資料結構2——LinkedList

1、LinkedList 是一個繼承於AbstractSequentialList的雙向連結串列。它也可以被當作堆疊、佇列或雙端佇列進行操作。 2、LinkedList相對於ArrayList來說,是可以快速新增,刪除元素,ArrayList新增刪除

eclipse上反編譯.class檔案java檔案(含解決錯誤)

前言:這篇文章我更多的是搬運工(就是連結別人的) 我這裡用jad作為反編譯工具, 需要用到兩個東西:jad工具和下載外掛 net.sf.jadclipse_3.3.0.jar。點選這裡下載 步驟: 1.下載後解壓,然後將解壓後的jad.exe檔案複製到%JAV

夯實Java基礎系列5:Java檔案Java結構

目錄 Java中的包概念 包的作用 package 的目錄結構 設定 CLASSPATH 系統變數 常用jar包 java軟體包的型別 dt.jar rt.jar *.java檔案的奧祕 *.Java檔案簡介 為什麼一個java原始檔中只能有一個public類? Main方法 外部類的訪問許可權

性能分析-- JAVA Thread Dump 分析綜述

頻繁 之前 監控 平臺 released 端口 16進制 後來 code https://blog.csdn.net/rachel_luo/article/details/8920596 最近在做性能測試,需要對線程堆棧進行分析,在網上收集了一些資料,學習完後,將相關知識整

Java併發程式設計高階技術-高效能併發框架原始碼解析與實戰資源同步

第1章 課程介紹(Java併發程式設計進階課程) 什麼是Disruptor?它一個高效能的非同步處理框架,號稱“單執行緒每秒可處理600W個訂單”的神器,本課程目標:徹底精通一個如此優秀的開源框架,面試秒殺面試官。本章會帶領小夥伴們先了解課程大綱與重點,然後模擬千萬,億級資料進行壓力測試。讓大

Android原始碼解析應用程式資源管理器Asset Manager的建立過程分析

轉載自:https://blog.csdn.net/luoshengyang/article/details/8791064 我們分析了Android應用程式資源的編譯和打包過程,最終得到的應用程式資源就與應用程式程式碼一起打包在一個APK檔案中。Android應用程式在執行的過程中,是通過一個

Java工程師成神路-基礎篇》Java基礎知識——序列化已完結

本文是《成神之路系列文章》中的一篇,主要是關於Java中序列化的一些介紹。 持續更新中 Java物件的序列化與反序列化 深入分析Java的序列化與反序列化 單例與序列化的那些事兒 Google Protocol Buffer 的使用和原理 拓展內容 關於 Java