1. 一些基本概念
創(chuàng)新互聯(lián)公司制作網(wǎng)站網(wǎng)頁找三站合一網(wǎng)站制作公司,專注于網(wǎng)頁設(shè)計(jì),網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè),網(wǎng)站設(shè)計(jì),企業(yè)網(wǎng)站搭建,網(wǎng)站開發(fā),建網(wǎng)站業(yè)務(wù),680元做網(wǎng)站,已為近1000家服務(wù),創(chuàng)新互聯(lián)公司網(wǎng)站建設(shè)將一如既往的為我們的客戶提供最優(yōu)質(zhì)的網(wǎng)站建設(shè)、網(wǎng)絡(luò)營銷推廣服務(wù)!在開始之前,我們需要聲明一件重要的事情是:我們不是在討論在運(yùn)行時(shí)通過反射機(jī)制運(yùn)行處理的注解,而是在討論在編譯時(shí)處理的注解。
編譯時(shí)注解跟運(yùn)行時(shí)注解到底區(qū)別在什么地方?其實(shí)說大也不大,主要是考慮到性能上面的問題。運(yùn)行時(shí)注解主要是完全依賴于反射,反射的效率比原生的慢,所以在內(nèi)存比較少,CPU比較爛的機(jī)器上會(huì)有一些卡頓現(xiàn)象出現(xiàn)。而編譯時(shí)注解完全不會(huì)有這個(gè)問題,因?yàn)樗谖覀兙幾g過程(java->class)中,通過一些注解標(biāo)示,去動(dòng)態(tài)生成一些類或者文件,所以跟我們的APK運(yùn)行完全沒有任何關(guān)系,自然就不存在性能上的問題。所以一般比較著名的開源項(xiàng)目如果采用注解功能,通常采用編譯時(shí)注解
注解處理器是 javac 自帶的一個(gè)工具,用來在編譯時(shí)期掃描處理注解信息。你可以為某些注解注冊自己的注解處理器。這里,我假設(shè)你已經(jīng)了解什么是注解及如何自定義注解。如果你還未了解注解的話,可以查看官方文檔。注解處理器在 Java 5 的時(shí)候就已經(jīng)存在了,但直到 Java 6 (發(fā)布于2006看十二月)的時(shí)候才有可用的API。過了一段時(shí)間java的使用者們才意識到注解處理器的強(qiáng)大。所以最近幾年它才開始流行。
一個(gè)特定注解的處理器以 java 源代碼(或者已編譯的字節(jié)碼)作為輸入,然后生成一些文件(通常是.java文件)作為輸出。那意味著什么呢?你可以生成 java 代碼!這些 java 代碼在生成的.java文件中。因此你不能改變已經(jīng)存在的java類,例如添加一個(gè)方法。這些生成的 java 文件跟其他手動(dòng)編寫的 java 源代碼一樣,將會(huì)被 javac 編譯。
Annotation processing是在編譯階段執(zhí)行的,它的原理就是讀入Java源代碼,解析注解,然后生成新的Java代碼。新生成的Java代碼最后被編譯成Java字節(jié)碼,注解解析器(Annotation Processor)不能改變讀入的Java 類,比如不能加入或刪除Java方法。
2. AbstractProcessor
讓我們來看一下處理器的 API。所有的處理器都繼承了AbstractProcessor,如下所示:
package com.example; import java.util.LinkedHashSet; import java.util.Set; import javax.annotation.processing.AbstractProcessor; import javax.annotation.processing.ProcessingEnvironment; import javax.annotation.processing.RoundEnvironment; import javax.annotation.processing.SupportedAnnotationTypes; import javax.annotation.processing.SupportedSourceVersion; import javax.lang.model.SourceVersion; import javax.lang.model.element.TypeElement; public class MyProcessor extends AbstractProcessor { @Override public boolean process(Set<? extends TypeElement> annoations, RoundEnvironment env) { return false; } @Override public Set<String> getSupportedAnnotationTypes() { Set<String> annotataions = new LinkedHashSet<String>(); annotataions.add("com.example.MyAnnotation"); return annotataions; } @Override public SourceVersion getSupportedSourceVersion() { return SourceVersion.latestSupported(); } @Override public synchronized void init(ProcessingEnvironment processingEnv) { super.init(processingEnv); } }
分享文章:Java注解處理器學(xué)習(xí)之編譯時(shí)處理的注解詳析-創(chuàng)新互聯(lián)
鏈接分享:http://aaarwkj.com/article26/gdgjg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、網(wǎng)站收錄、商城網(wǎng)站、微信公眾號、網(wǎng)頁設(shè)計(jì)公司、營銷型網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容