天天看點

鎂客網每周硬科技領域投融資彙總(1.27-1.31),英特爾拟大手筆收購以色列晶片制造商

1月份,國内航空航天已知融資事件達到了3起。

本周硬科技領域投融資事件一共29起,人工智能領域發生12起融資事件,占比42%;生物醫藥領域發生9起融資事件,占比32%;區塊鍊領域發生3起融資事件,分别占比11%;3R(VR/AR/MR)、新材料、新能源、航空航天和半導體領域分别發生1起融資事件,分别占比3%。

鎂客網每周硬科技領域投融資彙總(1.27-1.31),英特爾拟大手筆收購以色列晶片制造商

本周内,于1月初完成發動機核心元件“同軸渦輪泵”低溫媒體試驗考核的九州雲箭完成了自己的新一輪融資,金額達到數千萬人民币,可謂是雙喜臨門。另外,這也是國内航空航天領域,于1月(公開)發生的第三起融資事件。

此外,作為去年的行業熱點,晶片的熱度在2019年依舊處于高處。而在本周,英特爾拟出價55至60億美元現金和股票,希望收購以色列晶片制造商MellanoxTechnologies,後者為支撐雲計算的資料中心伺服器生産晶片和其他硬體。值得注意的是,在資料中心這一塊,英特爾已經占據了90%以上的市場,但随着AI晶片的崛起,不少新入廠商也盯上了這一塊市場。對于英特爾而言,若此次收購屬實,并最終成功,于其業務發展無疑是如虎添翼。

鎂客網每周硬科技領域投融資彙總(1.27-1.31),英特爾拟大手筆收購以色列晶片制造商

人工智能

未來黑科技FUTURUS

汽車平視顯示器研發商未來黑科技FUTURUS獲得億元人民币的Pre-B輪融資,投資方包括德厚資本和凱輝基金。

未來黑科技FUTURUS目标是把實體光學領域的新技術應用于智能駕駛和無人駕駛的全新顯示領域,主要研發了HUD(汽車平視顯示器)和免媒體光場全息技術。目前,該公司的業務主要有三部分:汽車前裝HUD、後裝“百路達HUD”、新技術研發,商業模式是技術輸出和産品售賣。

Cinnamon

日本AI創企Cinnamon獲得1400萬美元的B輪股權融資,投資者為索尼創新基金、Mirai Creation Fund等9家投資機構。

Cinnamon的核心産品是Flax Scanner,這是一款檔案閱讀器,底層的自然語言處理算法可以了解紙筆材料的語義意圖和上下文,将業務文檔轉換為資料庫檔案。另外,該公司的産品還包括推薦引擎Lapis Engine、聊天機器人Scuro Bot以及語音聽寫産品Rossa Voice。

ContentSquare

人工智能使用者行為大資料分析公司ContentSquare完成6000萬美元的C輪融資,領投方為Eurazeo,參投方包括Canaan、H14以及Highland Europe。

ContentSquare推出的軟體即服務産品是一個全自動數字型驗分析平台,通過追蹤移動裝置、PC裝置數十億次觸摸點和滑鼠移動來分析使用者行為,讓品牌商知道該如何提高使用者參與度、降低營運成本、實作最大化使用者轉化率。該平台不僅能夠告訴企業為什麼使用者轉換率會這麼低,還能告訴企業應該采取哪些措施來改善現狀。

Featurespace

AI反欺詐公司Featurespace完成2500萬英鎊的融資,領投方為Insight Venture Partners和MissionOG,現有投資者IP Group plc和Highland Europe等跟投。

Featurespace推出的ARIC平台能夠通過收集統計大量行為資料,進行不間斷的機器學習,了解每個客戶的行為,并通過檢測多個複雜資料集之間的異常,發現或識别新的和已知的欺詐攻擊。該平台現已被全球支付營運商Worldpay、英國清算銀行ClearBank等多個世界級銀行、保險公司和博彩機構應用。

拿森汽車電子

拿森汽車電子完成4億人民币的B輪股權融資,由經緯中國領投,啟明創投、金浦投資、尚融資本和麥星投資跟投。

拿森汽車電子緻力于為中國汽車市場提供先進完整的線控底盤系統,是國内唯一具備完整線控底盤核心技術的本土企業。公司主營産品包括NBooster智能刹車系統、EPS線控轉向系統等,二者作為自動駕駛的控制執行端,是自動駕駛汽車中最核心的關鍵部件。

ColLibra

資料管理初創公司ColLibra獲得1億美元的融資,由谷歌母公司Alphabet的成長性股票投資基金CapitalG領投,參與投資的還包括Iconiq Capital、Index Ventures等。

ColLibra公司的工具能讓公司客戶組織和利用它們在整個企業運轉過程中收集的資料。利用ColLibra的技術,公司客戶可以全面掌控如何收集和通路資料、資料存儲在何處、如何使用資料,以及它們是否利用這些資料來進行關鍵業務的決策。

漢升達

漢升達完成1000萬人民币的Pre-A輪融資,由乾融資本與元禾原點共同投資。

漢升達緻力于工業機器人核心零部件諧波減速器的研發,已成功研發出新材料精密諧波減速機和民用諧波傳動的産品等多項産品,并取得17項專利。此次融資将用于公司加速新材料類型諧波減速器和創新結構減速器的技術創新和市場推廣。

智言科技

智言科技獲得數千萬人民币的A輪融資,由同創偉業領投,老股東線性資本跟投。

智言科技緻力于為B端企業提供平民化的智能語義分析引擎,讓企業快速擁有智能對話系統和智能決策引擎。基于知識圖譜和深度學習技術,智言科技建立了深度語義了解模型,同時建構了保險及證券領域知識圖譜,進而開發了針對金融領域的智能機器人,可以為客戶提供從售前的需求挖掘、客戶行為激勵、金融産品推薦到售後的客戶關系、售後問題、客戶資料圖譜和營銷決策及更新提供支援。

健康有益

健康醫療AI技術服務提供商健康有益完成近億人民币的A輪融資,由中信國際領投,仁愛資本等跟投。

健康有益專注于人工智能在健康醫療領域的技術創新。目前,它建構完成千萬量級的健康醫療專業知識體系,具備在計算機視覺、自然語言處理、知識圖譜領域80%的AI核心技術,旗下産品和服務包含AI技術開放平台、人工智能作業系統、健康醫療管理系統、機器人系統以及健康醫療完整解決方案。

恺韻來

智能AGV及工業機器人研發商恺韻來完成A輪融資,由逐鹿資本獨投。

恺韻來緻力于AGV搬運機器人的研發與機器人的內建應用,重點發展包括AGV、RGV、電商搬運機器人、物流分揀機器人等,并專業為光伏行業提供了整套自動化改造方案、整套自動化裝置及解決方案。

上海介方

上海介方獲得千萬級人民币的戰略融資,投資方為中科創星。

憑借自主研發的軟體無線電架構軟體——軟體通信體系結構openSCA,以及配套的開發工具sdrIDE、VPX硬體解決方案openHW,上海介方緻力于為客戶提供100%源代碼授權的軟體無線電解決方案,幫助客戶實作“自主可控”和二次開發需求。該公司産品包括軟體無線電系統通用架構、機器人作業系統、智能無人機作業系統、飛行控制系統等。

新钛雲服

雲管理服務商新钛雲服獲得千萬級人民币的Pre-A輪融資。

新钛雲服為企業客戶提供雲咨詢、雲架構規劃設計、多雲內建、私有雲部署、雲運維管理等服務,并提供專業的行業解決方案,讓雲計算觸手可及,助力企業快速完成數字化轉型更新。

3R(VR/AR/MR)

Sandbox VR

VR初創公司Sandbox VR完成6800萬美元的A輪融資,投資者包括安德森·霍洛維茨基金、阿裡巴巴、斯坦福大學、CRCM等一系列知名機構。

Sandbox VR在商場和影院提供線下街機式VR體驗的體驗中心。目前,該公司同時正在全球六座城市營運着VR線下中心,包括加州聖馬特奧、溫哥華和香港。他們主要為玩家提供一個自由漫遊式空間,并允許其在多人VR體驗中共同對抗僵屍,外星人和亡靈海盜。

生物醫藥

蘭晟生物醫藥

神經精神系統疾病創新藥物研發企業蘭晟生物醫藥完成數千萬人民币的A輪融資,由翼樸資本領投,乾融資本、北極光創投共同跟投。

蘭晟生物醫藥緻力于開發結構全新、市場競争力強、适應症為神經精神系統慢性疾病的小分子化合物,業務涉及藥物靶點鑒定、新藥結構設計、藥學研究、藥物篩選評價等領域。目前,該公司已經建立了數目超過800種的小分子化合物庫。

Day Zero

傳染病診斷技術研發商Day Zero獲得860萬美元的A輪融資,由Triventures領投,Sands Capital Ventures和Golden Seeds跟投。

Day Zero緻力于開發Blood2Bac(從臨床樣本中提取細菌DNA的方法)。該公司已經建立了一個大型資料庫Micro hmDB,其中包含了病原體及其對抗生素耐藥性的全基因組序列,可用于機器學習算法Keynome的訓練。據悉,基于測序的快速診斷技術使用了高通量測序技術和專有的機器學習算法,可在短短數小時内識别出細菌病原體的種類以及抗生素耐藥性概況。

Mobius Imaging

醫療裝置廠商Mobius Imaging獲得來自Runway Growth Capital Fund的2000萬美元進階擔保債務融資。

Mobius Imaging提供移動計算機斷層掃描和醫學成像解決方案的醫療裝置。該公司制造的CT成像産品可減少手術室的輻射照射,其中已經在市場上銷售的移動CT成像裝置Airo,具有130多種有源裝置,可以在脊柱手術、神經外科、胸腔手術、放射惡性良性腫瘤科等場景下應用,能夠增強CT圖像的品質,并且已經獲得了FDA準許。

仁源欣生

生物技術公司仁源欣生完成200萬美元的天使輪融資,由和玉資本領投,賽賦醫藥研究院跟投。

仁源欣生是一家基于全新分子細胞生物學技術平台的高科技公司,緻力于開發全球領先的具有自主核心知識産權的大片段基因編輯技術,以建立高附加值動物模型,更高效的推動生物醫藥研發。目前,公司已經組建了基因編輯、小鼠模型建構及抗體開發團隊,預計2019年上半年在大片段基因編輯技術及在體産生單域抗體的小鼠模型等方面申請多發明專利。

Lyndra Therapeutics

生物制藥公司Lyndra Therapeutics完成5500萬美元的B輪融資,由Polaris Partners領投,厚樸投資、比爾及梅琳達·蓋茨基金會等跟投。

Lyndra Therapeutics緻力于研發針對各類疾病的超長效口服藥。該超長效口服藥能夠從根本上改變患者服藥方式,減少服藥頻率增加服藥依從性,進而減少藥物副作用,降低醫療成本。

Perfuze

醫療器械公司Perfuze獲得300萬歐元的種子輪融資,由Earlybird領投,MedFocus、Enterprise Ireland跟投。

Perfuze正在開發新一代導管技術Millipede,旨在用更短的手術時間取得更好的治療效果,進而使治療過程更安全、費用更低廉,為急性缺血性中風患者提供新的治療方案。

Dewpoint Therapeutics

生物科技公司Dewpoint Therapeutics獲得6000萬美元的A輪融資,由Polaris Partners領投,Samsara BioCapital和 Leaps by Bayer等跟投。

Dewpoint Therapeutics專注于開發一種含有蛋白質和RNA的生物分子縮合物,能夠加速生物分子縮合物内部的關鍵化學反應。生物分子縮合物可以熔合在一起,也可以被分裂,是以它們的尺寸、實體性質和成分都在不斷發生變化。這項名為“對相分離”的研究為藥物開發者提供了使用靶向蛋白質制造藥物的新方法。

NorCal Cannabis

垂直整合大麻營運商NorCal Cannabis完成2740萬美元的A輪融資,主要投資者包括CGOC、JM10 Partners和Cresco Capital。

NorCal Cannabis專注醫用大麻的研發和銷售。公司目前擁有最先進的生産裝置,包括超過10萬平方英尺用于研發、種植、生産和銷售的基地,以及全州傳遞倉庫的網絡。

亦諾微醫藥

免疫治療創新藥物研發商亦諾微醫藥完成1500萬美元的A+輪融資,由業内一知名投資機構領投,另有投資方幂方資本、力合科創 、薄荷天使基金、泰福資本、勤智資本和湧铧資本。

亦諾微醫藥緻力于惡性良性腫瘤的溶瘤免疫雙重治療藥物的研發、生産、銷售,利用疱疹病毒進行治療性惡性良性腫瘤疫苗的轉化,為使用者提供新一代溶瘤病毒産品。此輪融資将用于首個産品T3和T2的臨床研究,以及新産品的開發。

新材料

吸力奇迹

靜電吸附薄膜技術及産品研發商吸力奇迹獲得天使輪戰略投資,投資方為浙江華盛。

吸力奇迹的研發重點是靜電敏感高分子材料,從技術上突破了靜電敏感材料容易受到空氣濕度的影響的壁壘,進而為靜電驅動技術在工業中的應用提供了可能性。目前,基于靜電吸附薄膜等核心技術,公司已研發産品包括用于制衣行業的靜電吸附産品、針對工業自動化的靜電抓手等等。

新能源

中科利豐

專注可再生清潔能源技術研發與應用的中科利豐獲得戰略融資,投資方為理光集團。

中科利豐此前與理光聯合開發了“無人機光伏電站智能巡檢系統”,解決了太陽能光伏電站人工巡檢效率低、準确性差、成本高等問題,提高了電站運維能力、盈利能力,增加了電站的發電量。此外,雙方成立可再生能源人工智能聯合實驗室,探索并開發光伏電站地面巡檢機器人、風機葉片檢測無人機等技術和産品。

航空航天

九州雲箭

航空航天産品制造商九州雲箭完成新一輪數千萬人民币的融資,投資方為峰瑞資本。

九州雲箭專注于商業運載火箭用液氧甲烷發動機的研制。2019年1月初,九州雲箭“淩雲”發動機(推力12噸)核心元件-同軸渦輪泵完成了低溫媒體試驗考核。至此“淩雲”發動機的全部主要元件:點火器、瓦斯發生器、推力室、渦輪泵以及主副系統閥門和推力調節裝置均完成了元件級試驗。

半導體

智毅聚芯

高性能晶片研發商智毅聚芯完成天使輪融資,由清研陸石和啟迪之星共同投資。

智毅聚芯主營業務為高性能AD/DA晶片的研究、開發與銷售,主要向市場提供高性能模數轉換器(ADC)晶片、高性能數模轉換器(DAC)晶片等模拟信号鍊晶片産品,并提供IP授權,應用于雷達、通訊基站、導航裝置、工業高精控制、醫療儀器等衆多領域。

區塊鍊

CULedger

信用社行業區塊鍊聯盟CULedger獲得1000萬美元的種子輪融資。

CULedger是一家提供跨境全球分布式賬本平台的信用合作社服務組織。此輪融資過後,CULedger将計劃推出分布式賬本的平台,為信用社行業成員提供安全的數字身份工具。

TEEX

分布式可信計算平台TEEX獲得數百萬美元的首輪融資,投資方包括紅杉資本、IMO Ventures等。

TEEX基于可信執行環境、區塊鍊、密碼學等技術,旨在搭建一個去中心化、隐私安全的可信計算資源與資料共享平台。同時,TEEX通過為現有區塊鍊系統提供一套通用的Layer-2隐私計算方案,以解決傳統區塊鍊的性能與隐私問題。

Platin

去中心化位置證明協定(PoL)開發公司Platin獲得一筆融資,投資方為EOS生态系統基金。

Platin的主要目标是為數字資産提供安全隐私的定位功能,而使用者使用智能手機為第三方提供位置證明以賺取代币。

一、Mybatis源碼-反射子產品

1、JavaBean規範

JavaBean 具有如下特征:

  1. 所有的屬性都是私有的(通過 getter 和 setter 通路)
  2. 擁有公有的無參構造函數
  3. 提供 setter/getter
  4. 實作 Serializable 接口

2、Reflector 和 ReflectorFactory

出于性能方面的考慮,Mybatis 不是等到使用的時候去解析 XML/反射類,而是為每一個類提供了反射器類 Reflector ,該類中存儲了反射需要使用的類的元資訊。

2.1 Reflector 屬性

2.1.1 屬性

private static final String[] EMPTY_STRING_ARRAY = new String[0];

  private Class<?> type;
  //可讀屬性的名稱集合,可讀屬性就是存在相應 getter 方法的屬性,初始值為空數組
  private String[] readablePropertyNames = EMPTY_STRING_ARRAY;
  //可寫屬性的名稱集合,可寫屬性就是存在相應 setter 方法的屬性,初始值為空數組
  private String[] writeablePropertyNames = EMPTY_STRING_ARRAY;
  //記錄了屬性相應的 setter 方法,key 是屬性名稱,value 是 Invoker 對象,它是對 setter 方法對應 Method 對象的封裝
  private Map<String, Invoker> setMethods = new HashMap<String, Invoker>();
  //記錄了屬性相應的 getter 方法,key 是屬性名稱,value 是 Invoker 對象,它是對 getter 方法對應 Method 對象的封裝
  private Map<String, Invoker> getMethods = new HashMap<String, Invoker>();
  //記錄了屬性相應的 setter 方法的參數值類型,key 是屬性名稱,value 是 setter 方法的參數類型
  private Map<String, Class<?>> setTypes = new HashMap<String, Class<?>>();
  //記錄了屬性相應的 getter 方法的參數值類型,key 是屬性名稱,value 是 getter 方法的傳回值類型
  private Map<String, Class<?>> getTypes = new HashMap<String, Class<?>>();
  //記錄了預設構造方法
  private Constructor<?> defaultConstructor;

  //記錄了所有屬性名稱的集合
  private Map<String, String> caseInsensitivePropertyMap = new HashMap<String, String>();      

從上面類的屬性中,我們可以看出:

  1. 一個反射器 Reflector 對應着一個 Class 對象
  2. 記錄了預設構造函數
  3. 其餘的是屬性及其 setter/gettter 相關
    一、Mybatis源碼-反射子產品

    對于一個屬性(隻有有 setter/getter 才能被稱之為屬性)

    (1)如果是可讀的(有 getter 方法),則 Reflector 會将其及其方法處理後放入對應的可讀相關的集合中;

    (2)如果是可寫的(有 setter 方法),則 Reflector 會将其及其方法處理後放入對應的可寫相關的集合中;

    (3)最後使用​​

    ​Map<String, String> caseInsensitivePropertyMap​

    ​ 記錄所有的屬性。

2.1.2 Invoker 接口

在存儲方法的時候,​

​Reflector​

​​ 使用的是 ​

​Map<String, Invoker>​

​​,而不是 ​

​Map<String, Method>​

​。該接口定義了方法的調用和擷取類型,定義如下:

public interface Invoker {
  //調用擷取指定字段的值或者執行指定的方法
  Object invoke(Object target, Object[] args) throws IllegalAccessException, InvocationTargetException;
  //擷取類型
  Class<?> getType();
}      
一、Mybatis源碼-反射子產品
  • MethodInvoker:方法的 Invoker
  • GetFieldInvoker:如果沒有​

    ​getter​

    ​​,則使用該方法,通過​

    ​Filed​

    ​ 類直接讀取成員變量的值
  • SetFieldInvoker:如果沒有​

    ​setter​

    ​​,則使用該方法,通過​

    ​Filed​

    ​ 類直接設定成員變量的值

通過該封裝以後,本來需要聲明 ​

​Map<String, Method>​

​ 和 ​

​Map<String, Field>​

​ 表示的,隻需要使用 ​

​Map<String, Field>​

​ 即可表示。

2.2 Reflector 對外提供的方法

Reflector 對外提供的方法主要與構造函數和屬性相關。

一、Mybatis源碼-反射子產品
  • 構造函數:根據 Class 對象,設定 Reflector 相應的成員變量。
public Reflector(Class<?> clazz)      
  • 查找是否有相應的屬性
public String findPropertyName(String name)      
  • 判斷是否有預設構造函數
public boolean hasDefaultConstructor()      
  • 擷取預設的構造函數
public Constructor<?> getDefaultConstructor()      
  • 擷取 Reflector 對應的 Class 類型
public Class<?> getType()      
  • getter 相關的方法
//擷取所有的可讀屬性
public String[] getGetablePropertyNames()
//擷取所有的可讀屬性的 Invoker
public Invoker getGetInvoker(String propertyName)
//擷取對應屬性的類型
public Class<?> getGetterType(String propertyName)
//對應屬性是否有相應的 getter
public boolean hasGetter(String propertyName)      
  • setter相關的方法
//擷取所有的可寫屬性
public String[] getSetablePropertyNames()
//擷取所有的可寫屬性的 Invoker
public Invoker getSetInvoker(String propertyName)
//擷取可寫屬性 setter 方法的參數 
public Class<?> getSetterType(String propertyName)
//對應屬性是否有相應的 setter
public boolean hasSetter(String propertyName)      

2.3 Reflector 私有方法

每個 Reflector 對應緩存一個類的元反射資訊,通過 Map 進行緩存,後續通過鍵查找即可。是以,就涉及到幾個方法:

2.3.1擷取方法簽名

根據函數名稱、參數和傳回值類型來取得簽名,保證方法的唯一性

private String getSignature(Method method)      

該方法擷取方法的簽名,簽名的格式為:

傳回值類型#方法名:參數1,參數2,參數3

簽名的目的是為了保證唯一性,那麼使用語言本身的特性來保證唯一性是最好的:

  1. 方法名不一緻,則方法不一緻
  2. 傳回值不一緻或者不是其子類,則方法不一緻
  3. 參數數量,參數類型順序不一緻,則方法不一緻

    是以,以上的規則保證方法的唯一性。

2.3.2擷取類的所有方法

private Method[] getClassMethods(Class<?> cls)      

注意,由于在擷取方法時,通過調用目前類及其除 ​

​Object​

​​ 之外的所有父類的 ​

​getDeclaredMethods()​

​​ 和 ​

​getInterfaces()​

​​ 方法,是以,其擷取到的方法是該類及其父類的所有方法。

由此,産生一個問題,如果子類重寫了父類中的方法,如果傳回值相同,則可以通過鍵值重複來去掉。但是,如果方法傳回值類型是相同實體方法傳回值類型的子類型,則就會導緻兩個方法是同一個方法,但是簽名不同。是以,需要解決此類沖突。

2.3.3解決方法沖突:getter方法沖突解決

private void resolveGetterConflicts(Map<String, List<Method>> conflictingGetters)      

到了此步驟,屬性已經以 ​

​propName->List<Method>​

​​ 的形式存在于記憶體中。此時,需要将 ​

​Map<String, List>​

​​ 轉換為 ​

​Map<String, Invoker>​

​​。

該方法隻需要特别注意當傳回值類型不同,則哪一個方法的傳回值是另一個方法傳回值類型的子類型,就把 ​​

​propName​

​​ 指向該方法包裝成的 ​

​Invoker​

​​。這是因為重寫(​

​override​

​)時,重寫方法的傳回值類型可以是被重寫方法的子類。

2.3.4解決方法沖突:setter方法沖突解決

首先需要特别注意的是,為什麼 setter 也會出現沖突,畢竟沒有傳回值類型。主要是因為泛型的存在:

public void setPrice(T price);
public void setPrice(Double price);
public void setPrice(Integer price);      

顯然,遇到此類情況,子類中的方法才是我們需要的:

Class<?> paramType1 = setter1.getParameterTypes()[0];
    Class<?> paramType2 = setter2.getParameterTypes()[0];
    if (paramType1.isAssignableFrom(paramType2)) {
      return setter2;
    } else if (paramType2.isAssignableFrom(paramType1)) {
      return setter1;
    }      

參數中,父類方法泛型經過類型擦除後,變成 ​

​Object​

​ 。是以,通過以上的方法,哪個是子類,我們就擷取哪一個。

3、ReflectorFactory

看名稱,工廠方法,是為了建立個緩存 ​

​Reflector​

​ 的:

/**
 * 主要負責 Reflector 對象的建立和緩存
 */
public interface ReflectorFactory {

  /**
   * 檢測 ReflectorFactory 對象是否會緩存 Reflector 對象
   */
  boolean isClassCacheEnabled();
  /**
   * 設定是否緩存
   */
  void setClassCacheEnabled(boolean classCacheEnabled);
  /**
   * 緩存中查找 Class 對應的 Reflector 對象,找不到則建立
   */
  Reflector findForClass(Class<?> type);
}      

隻有三個方法:是否緩存,設定要不要緩存,根據類型查找 Reflector 對象,找不到則建立。其與 Reflector 的關系:

一、Mybatis源碼-反射子產品

mybatis 為我們提供了該方法的預設實作 ​​

​DefaultReflectorFactory​

​​ 。該類的實作很簡單,就是通過 ​

​ConcurrentMap<Class<?>, Reflector>​

​​ 對 ​

​Reflector​

​ 進行緩存。

4、MetaClass

​Reflector​

​ 實作了實體類元資訊的封裝,但是類中的成員變量是類的情況沒有進行處理。而 MetaClass 通過 ​

​ReflectorFactory​

​ 類型的成員變量,實作了實體類中成員變量是類情況的處理,通過與屬性工具類的結合,實作了對複雜表達式的解析和實作了擷取指定描述資訊的功能。

4.1 成員變量

public class MetaClass {
  //ReflectorFactory 對象,用于緩存 Reflector 對象
  private ReflectorFactory reflectorFactory;
  //在建立 MetaClass 時會指定一個類,該 Reflector 對象會用于記錄該類相關的元資訊
  private Reflector reflector;      

MetaClass 有兩個成員變量,分别是 ​

​reflectorFactory​

​​ 和 ​

​reflector​

​。

4.2 建立

MetaClass 構造函數是私有的:

private MetaClass(Class<?> type, ReflectorFactory reflectorFactory) {
  this.reflectorFactory = reflectorFactory;
    this.reflector = reflectorFactory.findForClass(type);
  }      

但是,其提供了兩個建立的方法,這兩個方法也是通過該方法進行建立對象的。

  • 通過​

    ​Class​

    ​​ 對象進行了​

    ​Reflector​

    ​ 對象的建立,并指派給成員變量
public static MetaClass forClass(Class<?> type, ReflectorFactory reflectorFactory) {
    return new MetaClass(type, reflectorFactory);
  }      
  • 通過屬性進行建立
/**
   * 通過屬性名稱,擷取屬性的 MetaClass
   */
  public MetaClass metaClassForProperty(String name) {
    Class<?> propType = reflector.getGetterType(name);
    return MetaClass.forClass(propType, reflectorFactory);
  }      

4.3 方法

該類中最重要的方法是:

/**
   * 解析複雜的屬性表達式,例如:<result property="orders[0].items[0].name" column="item1"/> 中 property="orders[0].items[0].name"
   * 案例:
   * @param name tele.name
   * @param builder
   * @return
   */
  private StringBuilder buildProperty(String name, StringBuilder builder) {
    //構造兼解析,name:tele.name
    PropertyTokenizer prop = new PropertyTokenizer(name);
    if (prop.hasNext()) {
      //prop.getName():tele propertyName:tele
      String propertyName = reflector.findPropertyName(prop.getName());
      if (propertyName != null) {
        builder.append(propertyName);
        builder.append(".");
        //為該屬性建立對應的 MetaClass 對象
        MetaClass metaProp = metaClassForProperty(propertyName);
        //遞歸解析 PropertyTokenizer.children 字段,并将解析結果添加到 builder 中儲存
        metaProp.buildProperty(prop.getChildren(), builder);
      }
    } else {
      String propertyName = reflector.findPropertyName(name);
      if (propertyName != null) {
        builder.append(propertyName);
      }
    }
    //tele.name
    return builder;
  }      

了解了這個方法(遞歸,該類中有很多類似的),就可以很好的對這個類進行了解,以查找(richType.richProperty)為例:

  1. 通過 PropertyTokenizer 對表達式進行解析, 得到目前的 name=richType, children=richProperty
  2. 從 reflector 中查找該 richType 屬性
  3. 将 richType 添加到 builder 中
  4. 使用 metaClassForProperty 建立 richType 的 MetaClass
  5. 遞歸調用自身來處理子表達式

退出的條件就是沒有子表達式。這個是為了,我們類中有成員變量是類,我們可以通過其找到他們的所有類及其屬性。

注意,在此過程中,​​

​ReflectorFactory​

​​ 一直是同一個,而其内部緩存了多個 ​

​Reflector​

​ 對象。

5、MetaObject

6、總結

鎂客網每周硬科技領域投融資彙總(1.27-1.31),英特爾拟大手筆收購以色列晶片制造商

1月份,國内航空航天已知融資事件達到了3起。

本周硬科技領域投融資事件一共29起,人工智能領域發生12起融資事件,占比42%;生物醫藥領域發生9起融資事件,占比32%;區塊鍊領域發生3起融資事件,分别占比11%;3R(VR/AR/MR)、新材料、新能源、航空航天和半導體領域分别發生1起融資事件,分别占比3%。

鎂客網每周硬科技領域投融資彙總(1.27-1.31),英特爾拟大手筆收購以色列晶片制造商

本周内,于1月初完成發動機核心元件“同軸渦輪泵”低溫媒體試驗考核的九州雲箭完成了自己的新一輪融資,金額達到數千萬人民币,可謂是雙喜臨門。另外,這也是國内航空航天領域,于1月(公開)發生的第三起融資事件。

此外,作為去年的行業熱點,晶片的熱度在2019年依舊處于高處。而在本周,英特爾拟出價55至60億美元現金和股票,希望收購以色列晶片制造商MellanoxTechnologies,後者為支撐雲計算的資料中心伺服器生産晶片和其他硬體。值得注意的是,在資料中心這一塊,英特爾已經占據了90%以上的市場,但随着AI晶片的崛起,不少新入廠商也盯上了這一塊市場。對于英特爾而言,若此次收購屬實,并最終成功,于其業務發展無疑是如虎添翼。

鎂客網每周硬科技領域投融資彙總(1.27-1.31),英特爾拟大手筆收購以色列晶片制造商

人工智能

未來黑科技FUTURUS

汽車平視顯示器研發商未來黑科技FUTURUS獲得億元人民币的Pre-B輪融資,投資方包括德厚資本和凱輝基金。

未來黑科技FUTURUS目标是把實體光學領域的新技術應用于智能駕駛和無人駕駛的全新顯示領域,主要研發了HUD(汽車平視顯示器)和免媒體光場全息技術。目前,該公司的業務主要有三部分:汽車前裝HUD、後裝“百路達HUD”、新技術研發,商業模式是技術輸出和産品售賣。

Cinnamon

日本AI創企Cinnamon獲得1400萬美元的B輪股權融資,投資者為索尼創新基金、Mirai Creation Fund等9家投資機構。

Cinnamon的核心産品是Flax Scanner,這是一款檔案閱讀器,底層的自然語言處理算法可以了解紙筆材料的語義意圖和上下文,将業務文檔轉換為資料庫檔案。另外,該公司的産品還包括推薦引擎Lapis Engine、聊天機器人Scuro Bot以及語音聽寫産品Rossa Voice。

ContentSquare

人工智能使用者行為大資料分析公司ContentSquare完成6000萬美元的C輪融資,領投方為Eurazeo,參投方包括Canaan、H14以及Highland Europe。

ContentSquare推出的軟體即服務産品是一個全自動數字型驗分析平台,通過追蹤移動裝置、PC裝置數十億次觸摸點和滑鼠移動來分析使用者行為,讓品牌商知道該如何提高使用者參與度、降低營運成本、實作最大化使用者轉化率。該平台不僅能夠告訴企業為什麼使用者轉換率會這麼低,還能告訴企業應該采取哪些措施來改善現狀。

Featurespace

AI反欺詐公司Featurespace完成2500萬英鎊的融資,領投方為Insight Venture Partners和MissionOG,現有投資者IP Group plc和Highland Europe等跟投。

Featurespace推出的ARIC平台能夠通過收集統計大量行為資料,進行不間斷的機器學習,了解每個客戶的行為,并通過檢測多個複雜資料集之間的異常,發現或識别新的和已知的欺詐攻擊。該平台現已被全球支付營運商Worldpay、英國清算銀行ClearBank等多個世界級銀行、保險公司和博彩機構應用。

拿森汽車電子

拿森汽車電子完成4億人民币的B輪股權融資,由經緯中國領投,啟明創投、金浦投資、尚融資本和麥星投資跟投。

拿森汽車電子緻力于為中國汽車市場提供先進完整的線控底盤系統,是國内唯一具備完整線控底盤核心技術的本土企業。公司主營産品包括NBooster智能刹車系統、EPS線控轉向系統等,二者作為自動駕駛的控制執行端,是自動駕駛汽車中最核心的關鍵部件。

ColLibra

資料管理初創公司ColLibra獲得1億美元的融資,由谷歌母公司Alphabet的成長性股票投資基金CapitalG領投,參與投資的還包括Iconiq Capital、Index Ventures等。

ColLibra公司的工具能讓公司客戶組織和利用它們在整個企業運轉過程中收集的資料。利用ColLibra的技術,公司客戶可以全面掌控如何收集和通路資料、資料存儲在何處、如何使用資料,以及它們是否利用這些資料來進行關鍵業務的決策。

漢升達

漢升達完成1000萬人民币的Pre-A輪融資,由乾融資本與元禾原點共同投資。

漢升達緻力于工業機器人核心零部件諧波減速器的研發,已成功研發出新材料精密諧波減速機和民用諧波傳動的産品等多項産品,并取得17項專利。此次融資将用于公司加速新材料類型諧波減速器和創新結構減速器的技術創新和市場推廣。

智言科技

智言科技獲得數千萬人民币的A輪融資,由同創偉業領投,老股東線性資本跟投。

智言科技緻力于為B端企業提供平民化的智能語義分析引擎,讓企業快速擁有智能對話系統和智能決策引擎。基于知識圖譜和深度學習技術,智言科技建立了深度語義了解模型,同時建構了保險及證券領域知識圖譜,進而開發了針對金融領域的智能機器人,可以為客戶提供從售前的需求挖掘、客戶行為激勵、金融産品推薦到售後的客戶關系、售後問題、客戶資料圖譜和營銷決策及更新提供支援。

健康有益

健康醫療AI技術服務提供商健康有益完成近億人民币的A輪融資,由中信國際領投,仁愛資本等跟投。

健康有益專注于人工智能在健康醫療領域的技術創新。目前,它建構完成千萬量級的健康醫療專業知識體系,具備在計算機視覺、自然語言處理、知識圖譜領域80%的AI核心技術,旗下産品和服務包含AI技術開放平台、人工智能作業系統、健康醫療管理系統、機器人系統以及健康醫療完整解決方案。

恺韻來

智能AGV及工業機器人研發商恺韻來完成A輪融資,由逐鹿資本獨投。

恺韻來緻力于AGV搬運機器人的研發與機器人的內建應用,重點發展包括AGV、RGV、電商搬運機器人、物流分揀機器人等,并專業為光伏行業提供了整套自動化改造方案、整套自動化裝置及解決方案。

上海介方

上海介方獲得千萬級人民币的戰略融資,投資方為中科創星。

憑借自主研發的軟體無線電架構軟體——軟體通信體系結構openSCA,以及配套的開發工具sdrIDE、VPX硬體解決方案openHW,上海介方緻力于為客戶提供100%源代碼授權的軟體無線電解決方案,幫助客戶實作“自主可控”和二次開發需求。該公司産品包括軟體無線電系統通用架構、機器人作業系統、智能無人機作業系統、飛行控制系統等。

新钛雲服

雲管理服務商新钛雲服獲得千萬級人民币的Pre-A輪融資。

新钛雲服為企業客戶提供雲咨詢、雲架構規劃設計、多雲內建、私有雲部署、雲運維管理等服務,并提供專業的行業解決方案,讓雲計算觸手可及,助力企業快速完成數字化轉型更新。

3R(VR/AR/MR)

Sandbox VR

VR初創公司Sandbox VR完成6800萬美元的A輪融資,投資者包括安德森·霍洛維茨基金、阿裡巴巴、斯坦福大學、CRCM等一系列知名機構。

Sandbox VR在商場和影院提供線下街機式VR體驗的體驗中心。目前,該公司同時正在全球六座城市營運着VR線下中心,包括加州聖馬特奧、溫哥華和香港。他們主要為玩家提供一個自由漫遊式空間,并允許其在多人VR體驗中共同對抗僵屍,外星人和亡靈海盜。

生物醫藥

蘭晟生物醫藥

神經精神系統疾病創新藥物研發企業蘭晟生物醫藥完成數千萬人民币的A輪融資,由翼樸資本領投,乾融資本、北極光創投共同跟投。

蘭晟生物醫藥緻力于開發結構全新、市場競争力強、适應症為神經精神系統慢性疾病的小分子化合物,業務涉及藥物靶點鑒定、新藥結構設計、藥學研究、藥物篩選評價等領域。目前,該公司已經建立了數目超過800種的小分子化合物庫。

Day Zero

傳染病診斷技術研發商Day Zero獲得860萬美元的A輪融資,由Triventures領投,Sands Capital Ventures和Golden Seeds跟投。

Day Zero緻力于開發Blood2Bac(從臨床樣本中提取細菌DNA的方法)。該公司已經建立了一個大型資料庫Micro hmDB,其中包含了病原體及其對抗生素耐藥性的全基因組序列,可用于機器學習算法Keynome的訓練。據悉,基于測序的快速診斷技術使用了高通量測序技術和專有的機器學習算法,可在短短數小時内識别出細菌病原體的種類以及抗生素耐藥性概況。

Mobius Imaging

醫療裝置廠商Mobius Imaging獲得來自Runway Growth Capital Fund的2000萬美元進階擔保債務融資。

Mobius Imaging提供移動計算機斷層掃描和醫學成像解決方案的醫療裝置。該公司制造的CT成像産品可減少手術室的輻射照射,其中已經在市場上銷售的移動CT成像裝置Airo,具有130多種有源裝置,可以在脊柱手術、神經外科、胸腔手術、放射惡性良性腫瘤科等場景下應用,能夠增強CT圖像的品質,并且已經獲得了FDA準許。

仁源欣生

生物技術公司仁源欣生完成200萬美元的天使輪融資,由和玉資本領投,賽賦醫藥研究院跟投。

仁源欣生是一家基于全新分子細胞生物學技術平台的高科技公司,緻力于開發全球領先的具有自主核心知識産權的大片段基因編輯技術,以建立高附加值動物模型,更高效的推動生物醫藥研發。目前,公司已經組建了基因編輯、小鼠模型建構及抗體開發團隊,預計2019年上半年在大片段基因編輯技術及在體産生單域抗體的小鼠模型等方面申請多發明專利。

Lyndra Therapeutics

生物制藥公司Lyndra Therapeutics完成5500萬美元的B輪融資,由Polaris Partners領投,厚樸投資、比爾及梅琳達·蓋茨基金會等跟投。

Lyndra Therapeutics緻力于研發針對各類疾病的超長效口服藥。該超長效口服藥能夠從根本上改變患者服藥方式,減少服藥頻率增加服藥依從性,進而減少藥物副作用,降低醫療成本。

Perfuze

醫療器械公司Perfuze獲得300萬歐元的種子輪融資,由Earlybird領投,MedFocus、Enterprise Ireland跟投。

Perfuze正在開發新一代導管技術Millipede,旨在用更短的手術時間取得更好的治療效果,進而使治療過程更安全、費用更低廉,為急性缺血性中風患者提供新的治療方案。

Dewpoint Therapeutics

生物科技公司Dewpoint Therapeutics獲得6000萬美元的A輪融資,由Polaris Partners領投,Samsara BioCapital和 Leaps by Bayer等跟投。

Dewpoint Therapeutics專注于開發一種含有蛋白質和RNA的生物分子縮合物,能夠加速生物分子縮合物内部的關鍵化學反應。生物分子縮合物可以熔合在一起,也可以被分裂,是以它們的尺寸、實體性質和成分都在不斷發生變化。這項名為“對相分離”的研究為藥物開發者提供了使用靶向蛋白質制造藥物的新方法。

NorCal Cannabis

垂直整合大麻營運商NorCal Cannabis完成2740萬美元的A輪融資,主要投資者包括CGOC、JM10 Partners和Cresco Capital。

NorCal Cannabis專注醫用大麻的研發和銷售。公司目前擁有最先進的生産裝置,包括超過10萬平方英尺用于研發、種植、生産和銷售的基地,以及全州傳遞倉庫的網絡。

亦諾微醫藥

免疫治療創新藥物研發商亦諾微醫藥完成1500萬美元的A+輪融資,由業内一知名投資機構領投,另有投資方幂方資本、力合科創 、薄荷天使基金、泰福資本、勤智資本和湧铧資本。

亦諾微醫藥緻力于惡性良性腫瘤的溶瘤免疫雙重治療藥物的研發、生産、銷售,利用疱疹病毒進行治療性惡性良性腫瘤疫苗的轉化,為使用者提供新一代溶瘤病毒産品。此輪融資将用于首個産品T3和T2的臨床研究,以及新産品的開發。

新材料

吸力奇迹

靜電吸附薄膜技術及産品研發商吸力奇迹獲得天使輪戰略投資,投資方為浙江華盛。

吸力奇迹的研發重點是靜電敏感高分子材料,從技術上突破了靜電敏感材料容易受到空氣濕度的影響的壁壘,進而為靜電驅動技術在工業中的應用提供了可能性。目前,基于靜電吸附薄膜等核心技術,公司已研發産品包括用于制衣行業的靜電吸附産品、針對工業自動化的靜電抓手等等。

新能源

中科利豐

專注可再生清潔能源技術研發與應用的中科利豐獲得戰略融資,投資方為理光集團。

中科利豐此前與理光聯合開發了“無人機光伏電站智能巡檢系統”,解決了太陽能光伏電站人工巡檢效率低、準确性差、成本高等問題,提高了電站運維能力、盈利能力,增加了電站的發電量。此外,雙方成立可再生能源人工智能聯合實驗室,探索并開發光伏電站地面巡檢機器人、風機葉片檢測無人機等技術和産品。

航空航天

九州雲箭

航空航天産品制造商九州雲箭完成新一輪數千萬人民币的融資,投資方為峰瑞資本。

九州雲箭專注于商業運載火箭用液氧甲烷發動機的研制。2019年1月初,九州雲箭“淩雲”發動機(推力12噸)核心元件-同軸渦輪泵完成了低溫媒體試驗考核。至此“淩雲”發動機的全部主要元件:點火器、瓦斯發生器、推力室、渦輪泵以及主副系統閥門和推力調節裝置均完成了元件級試驗。

半導體

智毅聚芯

高性能晶片研發商智毅聚芯完成天使輪融資,由清研陸石和啟迪之星共同投資。

智毅聚芯主營業務為高性能AD/DA晶片的研究、開發與銷售,主要向市場提供高性能模數轉換器(ADC)晶片、高性能數模轉換器(DAC)晶片等模拟信号鍊晶片産品,并提供IP授權,應用于雷達、通訊基站、導航裝置、工業高精控制、醫療儀器等衆多領域。

區塊鍊

CULedger

信用社行業區塊鍊聯盟CULedger獲得1000萬美元的種子輪融資。

CULedger是一家提供跨境全球分布式賬本平台的信用合作社服務組織。此輪融資過後,CULedger将計劃推出分布式賬本的平台,為信用社行業成員提供安全的數字身份工具。

TEEX

分布式可信計算平台TEEX獲得數百萬美元的首輪融資,投資方包括紅杉資本、IMO Ventures等。

TEEX基于可信執行環境、區塊鍊、密碼學等技術,旨在搭建一個去中心化、隐私安全的可信計算資源與資料共享平台。同時,TEEX通過為現有區塊鍊系統提供一套通用的Layer-2隐私計算方案,以解決傳統區塊鍊的性能與隐私問題。

Platin

去中心化位置證明協定(PoL)開發公司Platin獲得一筆融資,投資方為EOS生态系統基金。

Platin的主要目标是為數字資産提供安全隐私的定位功能,而使用者使用智能手機為第三方提供位置證明以賺取代币。

一、Mybatis源碼-反射子產品

1、JavaBean規範

JavaBean 具有如下特征:

  1. 所有的屬性都是私有的(通過 getter 和 setter 通路)
  2. 擁有公有的無參構造函數
  3. 提供 setter/getter
  4. 實作 Serializable 接口

2、Reflector 和 ReflectorFactory

出于性能方面的考慮,Mybatis 不是等到使用的時候去解析 XML/反射類,而是為每一個類提供了反射器類 Reflector ,該類中存儲了反射需要使用的類的元資訊。

2.1 Reflector 屬性

2.1.1 屬性

private static final String[] EMPTY_STRING_ARRAY = new String[0];

  private Class<?> type;
  //可讀屬性的名稱集合,可讀屬性就是存在相應 getter 方法的屬性,初始值為空數組
  private String[] readablePropertyNames = EMPTY_STRING_ARRAY;
  //可寫屬性的名稱集合,可寫屬性就是存在相應 setter 方法的屬性,初始值為空數組
  private String[] writeablePropertyNames = EMPTY_STRING_ARRAY;
  //記錄了屬性相應的 setter 方法,key 是屬性名稱,value 是 Invoker 對象,它是對 setter 方法對應 Method 對象的封裝
  private Map<String, Invoker> setMethods = new HashMap<String, Invoker>();
  //記錄了屬性相應的 getter 方法,key 是屬性名稱,value 是 Invoker 對象,它是對 getter 方法對應 Method 對象的封裝
  private Map<String, Invoker> getMethods = new HashMap<String, Invoker>();
  //記錄了屬性相應的 setter 方法的參數值類型,key 是屬性名稱,value 是 setter 方法的參數類型
  private Map<String, Class<?>> setTypes = new HashMap<String, Class<?>>();
  //記錄了屬性相應的 getter 方法的參數值類型,key 是屬性名稱,value 是 getter 方法的傳回值類型
  private Map<String, Class<?>> getTypes = new HashMap<String, Class<?>>();
  //記錄了預設構造方法
  private Constructor<?> defaultConstructor;

  //記錄了所有屬性名稱的集合
  private Map<String, String> caseInsensitivePropertyMap = new HashMap<String, String>();      

從上面類的屬性中,我們可以看出:

  1. 一個反射器 Reflector 對應着一個 Class 對象
  2. 記錄了預設構造函數
  3. 其餘的是屬性及其 setter/gettter 相關
    一、Mybatis源碼-反射子產品

    對于一個屬性(隻有有 setter/getter 才能被稱之為屬性)

    (1)如果是可讀的(有 getter 方法),則 Reflector 會将其及其方法處理後放入對應的可讀相關的集合中;

    (2)如果是可寫的(有 setter 方法),則 Reflector 會将其及其方法處理後放入對應的可寫相關的集合中;

    (3)最後使用​​

    ​Map<String, String> caseInsensitivePropertyMap​

    ​ 記錄所有的屬性。

2.1.2 Invoker 接口

在存儲方法的時候,​

​Reflector​

​​ 使用的是 ​

​Map<String, Invoker>​

​​,而不是 ​

​Map<String, Method>​

​。該接口定義了方法的調用和擷取類型,定義如下:

public interface Invoker {
  //調用擷取指定字段的值或者執行指定的方法
  Object invoke(Object target, Object[] args) throws IllegalAccessException, InvocationTargetException;
  //擷取類型
  Class<?> getType();
}      
一、Mybatis源碼-反射子產品
  • MethodInvoker:方法的 Invoker
  • GetFieldInvoker:如果沒有​

    ​getter​

    ​​,則使用該方法,通過​

    ​Filed​

    ​ 類直接讀取成員變量的值
  • SetFieldInvoker:如果沒有​

    ​setter​

    ​​,則使用該方法,通過​

    ​Filed​

    ​ 類直接設定成員變量的值

通過該封裝以後,本來需要聲明 ​

​Map<String, Method>​

​ 和 ​

​Map<String, Field>​

​ 表示的,隻需要使用 ​

​Map<String, Field>​

​ 即可表示。

2.2 Reflector 對外提供的方法

Reflector 對外提供的方法主要與構造函數和屬性相關。

一、Mybatis源碼-反射子產品
  • 構造函數:根據 Class 對象,設定 Reflector 相應的成員變量。
public Reflector(Class<?> clazz)      
  • 查找是否有相應的屬性
public String findPropertyName(String name)      
  • 判斷是否有預設構造函數
public boolean hasDefaultConstructor()      
  • 擷取預設的構造函數
public Constructor<?> getDefaultConstructor()      
  • 擷取 Reflector 對應的 Class 類型
public Class<?> getType()      
  • getter 相關的方法
//擷取所有的可讀屬性
public String[] getGetablePropertyNames()
//擷取所有的可讀屬性的 Invoker
public Invoker getGetInvoker(String propertyName)
//擷取對應屬性的類型
public Class<?> getGetterType(String propertyName)
//對應屬性是否有相應的 getter
public boolean hasGetter(String propertyName)      
  • setter相關的方法
//擷取所有的可寫屬性
public String[] getSetablePropertyNames()
//擷取所有的可寫屬性的 Invoker
public Invoker getSetInvoker(String propertyName)
//擷取可寫屬性 setter 方法的參數 
public Class<?> getSetterType(String propertyName)
//對應屬性是否有相應的 setter
public boolean hasSetter(String propertyName)      

2.3 Reflector 私有方法

每個 Reflector 對應緩存一個類的元反射資訊,通過 Map 進行緩存,後續通過鍵查找即可。是以,就涉及到幾個方法:

2.3.1擷取方法簽名

根據函數名稱、參數和傳回值類型來取得簽名,保證方法的唯一性

private String getSignature(Method method)      

該方法擷取方法的簽名,簽名的格式為:

傳回值類型#方法名:參數1,參數2,參數3

簽名的目的是為了保證唯一性,那麼使用語言本身的特性來保證唯一性是最好的:

  1. 方法名不一緻,則方法不一緻
  2. 傳回值不一緻或者不是其子類,則方法不一緻
  3. 參數數量,參數類型順序不一緻,則方法不一緻

    是以,以上的規則保證方法的唯一性。

2.3.2擷取類的所有方法

private Method[] getClassMethods(Class<?> cls)      

注意,由于在擷取方法時,通過調用目前類及其除 ​

​Object​

​​ 之外的所有父類的 ​

​getDeclaredMethods()​

​​ 和 ​

​getInterfaces()​

​​ 方法,是以,其擷取到的方法是該類及其父類的所有方法。

由此,産生一個問題,如果子類重寫了父類中的方法,如果傳回值相同,則可以通過鍵值重複來去掉。但是,如果方法傳回值類型是相同實體方法傳回值類型的子類型,則就會導緻兩個方法是同一個方法,但是簽名不同。是以,需要解決此類沖突。

2.3.3解決方法沖突:getter方法沖突解決

private void resolveGetterConflicts(Map<String, List<Method>> conflictingGetters)      

到了此步驟,屬性已經以 ​

​propName->List<Method>​

​​ 的形式存在于記憶體中。此時,需要将 ​

​Map<String, List>​

​​ 轉換為 ​

​Map<String, Invoker>​

​​。

該方法隻需要特别注意當傳回值類型不同,則哪一個方法的傳回值是另一個方法傳回值類型的子類型,就把 ​​

​propName​

​​ 指向該方法包裝成的 ​

​Invoker​

​​。這是因為重寫(​

​override​

​)時,重寫方法的傳回值類型可以是被重寫方法的子類。

2.3.4解決方法沖突:setter方法沖突解決

首先需要特别注意的是,為什麼 setter 也會出現沖突,畢竟沒有傳回值類型。主要是因為泛型的存在:

public void setPrice(T price);
public void setPrice(Double price);
public void setPrice(Integer price);      

顯然,遇到此類情況,子類中的方法才是我們需要的:

Class<?> paramType1 = setter1.getParameterTypes()[0];
    Class<?> paramType2 = setter2.getParameterTypes()[0];
    if (paramType1.isAssignableFrom(paramType2)) {
      return setter2;
    } else if (paramType2.isAssignableFrom(paramType1)) {
      return setter1;
    }      

參數中,父類方法泛型經過類型擦除後,變成 ​

​Object​

​ 。是以,通過以上的方法,哪個是子類,我們就擷取哪一個。

3、ReflectorFactory

看名稱,工廠方法,是為了建立個緩存 ​

​Reflector​

​ 的:

/**
 * 主要負責 Reflector 對象的建立和緩存
 */
public interface ReflectorFactory {

  /**
   * 檢測 ReflectorFactory 對象是否會緩存 Reflector 對象
   */
  boolean isClassCacheEnabled();
  /**
   * 設定是否緩存
   */
  void setClassCacheEnabled(boolean classCacheEnabled);
  /**
   * 緩存中查找 Class 對應的 Reflector 對象,找不到則建立
   */
  Reflector findForClass(Class<?> type);
}      

隻有三個方法:是否緩存,設定要不要緩存,根據類型查找 Reflector 對象,找不到則建立。其與 Reflector 的關系:

一、Mybatis源碼-反射子產品

mybatis 為我們提供了該方法的預設實作 ​​

​DefaultReflectorFactory​

​​ 。該類的實作很簡單,就是通過 ​

​ConcurrentMap<Class<?>, Reflector>​

​​ 對 ​

​Reflector​

​ 進行緩存。

4、MetaClass

​Reflector​

​ 實作了實體類元資訊的封裝,但是類中的成員變量是類的情況沒有進行處理。而 MetaClass 通過 ​

​ReflectorFactory​

​ 類型的成員變量,實作了實體類中成員變量是類情況的處理,通過與屬性工具類的結合,實作了對複雜表達式的解析和實作了擷取指定描述資訊的功能。

4.1 成員變量

public class MetaClass {
  //ReflectorFactory 對象,用于緩存 Reflector 對象
  private ReflectorFactory reflectorFactory;
  //在建立 MetaClass 時會指定一個類,該 Reflector 對象會用于記錄該類相關的元資訊
  private Reflector reflector;      

MetaClass 有兩個成員變量,分别是 ​

​reflectorFactory​

​​ 和 ​

​reflector​

​。

4.2 建立

MetaClass 構造函數是私有的:

private MetaClass(Class<?> type, ReflectorFactory reflectorFactory) {
  this.reflectorFactory = reflectorFactory;
    this.reflector = reflectorFactory.findForClass(type);
  }      

但是,其提供了兩個建立的方法,這兩個方法也是通過該方法進行建立對象的。

  • 通過​

    ​Class​

    ​​ 對象進行了​

    ​Reflector​

    ​ 對象的建立,并指派給成員變量
public static MetaClass forClass(Class<?> type, ReflectorFactory reflectorFactory) {
    return new MetaClass(type, reflectorFactory);
  }      
  • 通過屬性進行建立
/**
   * 通過屬性名稱,擷取屬性的 MetaClass
   */
  public MetaClass metaClassForProperty(String name) {
    Class<?> propType = reflector.getGetterType(name);
    return MetaClass.forClass(propType, reflectorFactory);
  }      

4.3 方法

該類中最重要的方法是:

/**
   * 解析複雜的屬性表達式,例如:<result property="orders[0].items[0].name" column="item1"/> 中 property="orders[0].items[0].name"
   * 案例:
   * @param name tele.name
   * @param builder
   * @return
   */
  private StringBuilder buildProperty(String name, StringBuilder builder) {
    //構造兼解析,name:tele.name
    PropertyTokenizer prop = new PropertyTokenizer(name);
    if (prop.hasNext()) {
      //prop.getName():tele propertyName:tele
      String propertyName = reflector.findPropertyName(prop.getName());
      if (propertyName != null) {
        builder.append(propertyName);
        builder.append(".");
        //為該屬性建立對應的 MetaClass 對象
        MetaClass metaProp = metaClassForProperty(propertyName);
        //遞歸解析 PropertyTokenizer.children 字段,并将解析結果添加到 builder 中儲存
        metaProp.buildProperty(prop.getChildren(), builder);
      }
    } else {
      String propertyName = reflector.findPropertyName(name);
      if (propertyName != null) {
        builder.append(propertyName);
      }
    }
    //tele.name
    return builder;
  }      

了解了這個方法(遞歸,該類中有很多類似的),就可以很好的對這個類進行了解,以查找(richType.richProperty)為例:

  1. 通過 PropertyTokenizer 對表達式進行解析, 得到目前的 name=richType, children=richProperty
  2. 從 reflector 中查找該 richType 屬性
  3. 将 richType 添加到 builder 中
  4. 使用 metaClassForProperty 建立 richType 的 MetaClass
  5. 遞歸調用自身來處理子表達式

退出的條件就是沒有子表達式。這個是為了,我們類中有成員變量是類,我們可以通過其找到他們的所有類及其屬性。

注意,在此過程中,​​

​ReflectorFactory​

​​ 一直是同一個,而其内部緩存了多個 ​

​Reflector​

​ 對象。

5、MetaObject

6、總結