[轉]java註解與APT技術

來源:互聯網
上載者:User

標籤:影響   抽象   iss   沒有響應   com   通過   The   nts   addm   

 

下面是一個簡單的自訂註解的栗子:

package annotation;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** * 動物名稱註解 * */@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface AnimalName {    String value() default "";}

 

定義了註解,並在需要的時候給相關類,類屬性加上註解資訊,如果沒有響應的註解資訊處理流程,註解可以說是沒有實用價值,接下來要介紹的是java的APT(Annotation Process Tool)技術,用於處理自訂註解。

2,APT技術

APT(Annotation Process Tool),是一種在代碼編譯時間處理註解,按照一定的規則,產生相應的java檔案,多用於對自訂註解的處理,目前比較流行的Dagger2, ButterKnife, EventBus3都是採用APT技術,對運行時的效能影響很小。我們通過自訂註解的方式,來瞭解一下如何使用APT:

1,自訂註解:
@Target({ElementType.TYPE})   ---作用範圍 Class@Retention(RetentionPolicy.CLASS)  ---生命週期:僅保留到.class檔案public @interface Route {    /** Path of route*/    String value();  ---類似於成員變數}

 

2,使用方式
@Route(path = "/test/activity2")public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_test2);    }}

JVM預設只會處理@override等語言內建的註解,對於自訂的註解,需要我們自己處理,java提供了一個名為AbstractProcessor.java的抽象類別,我們只要繼承該類,就實現自己的註解處理器,來處理自訂的@Route註解

public class RouteProcessor extends AbstractProcessor {    @Override    public synchronized void init(ProcessingEnvironment env){         // 主要做一些初始化操作    }    @Override        public boolean process(Set<? extends TypeElement> annoations, RoundEnvironment env) {         //具體處理註解的邏輯,控制碼的產生        processAnnotations();    }    @Override    public Set<String> getSupportedAnnotationTypes() {        // 支援處理的註解類型, 在這裡就是@Route    }    @Override    public SourceVersion getSupportedSourceVersion() {      //java版本 如:jdk1.6or jdk1.7   }}
3,自訂Processor
@AutoService(Processor.class)public class HelloProcessor extends AbstractProcessor {    /** 檔案相關的輔助類 用於產生新的源檔案、class等 */    private Filer mFiler;    @Override    public synchronized void init(ProcessingEnvironment processingEnv) {        super.init(processingEnv);        mFiler = processingEnv.getFiler();    }    @Override    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {        // 構建方法 此處使用到了square公司的javapoet庫,用來輔助產生 類的代碼        MethodSpec.Builder methodBuilder = MethodSpec.methodBuilder("show")                .addModifiers(Modifier.PUBLIC);        methodBuilder.addStatement("String test = \"$N\" ","hello annotation world!");        /** 構建類 */        TypeSpec finderClass = TypeSpec.classBuilder("Hello$$Inject")                .addModifiers(Modifier.PUBLIC)                .addMethod(methodBuilder.build())                .build();        try {            JavaFile.builder("com.win.test",finderClass).build().writeTo(mFiler);        } catch (IOException e) {            e.printStackTrace();        }        return true;    }    // 支援的註解類型    @Override    public Set<String> getSupportedAnnotationTypes() {        Set<String> types = new LinkedHashSet<>();        types.add(Hello.class.getCanonicalName());        return types;    }    @Override    public SourceVersion getSupportedSourceVersion() {        return super.getSupportedSourceVersion();    }}

在AS工程中使用

@Hello("MainTest")   //自訂的Hello註解public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);    }}

在項目App module的build目錄下,便會產生對應的java類檔案:

這個只是簡單的栗子,我們可以在process()方法中,加入更多的商務邏輯,以實現特定功能。

[轉]java註解與APT技術

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.