android - 编译时如何生成代码

标签 android

有没有办法在编译的时候生成代码。 例如: 我写了一个Activity

public class XXActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
        super.onCreate(savedInstanceState, persistentState);
        doSomething();
    }

    private void doSomething() {

    }
}

我想记录方法doSomething()前后的时间:

public class XXActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
        super.onCreate(savedInstanceState, persistentState);
        Log.i("XX", "start:" + System.currentTimeMillis()); // auto generate when compiling
        doSomething();
        Log.i("XX", "finish:" + System.currentTimeMillis()); // auto generate when compiling
    }

    private void doSomething() {

    }
}

如何实现如上示例的效果,任何想法表示赞赏。

最佳答案

您应该创建自定义注释。开始看this教程:

@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
   StringBuilder builder = new StringBuilder()
           .append("package com.stablekernel.annotationprocessor.generated;nn")
           .append("public class GeneratedClass {nn") // open class
           .append("tpublic String getMessage() {n") // open method
           .append("ttreturn "");


   // for each javax.lang.model.element.Element annotated with the CustomAnnotation
   for (Element element : roundEnv.getElementsAnnotatedWith(CustomAnnotation.class)) {
       String objectType = element.getSimpleName().toString();



       // this is appending to the return statement
       builder.append(objectType).append(" says hello!\n");
   }


   builder.append("";n") // end return
           .append("t}n") // close method
           .append("}n"); // close class



   try { // write the file
       JavaFileObject source = processingEnv.getFiler().createSourceFile("com.stablekernel.annotationprocessor.generated.GeneratedClass");


       Writer writer = source.openWriter();
       writer.write(builder.toString());
       writer.flush();
       writer.close();
   } catch (IOException e) {
       // Note: calling e.printStackTrace() will print IO errors
       // that occur from the file already existing after its first run, this is normal
   }

   return true;
}

关于android - 编译时如何生成代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40149400/

相关文章:

android 如何发送 int 和 double 作为 namevaluepair 作为 http post

android - 如何使用 Delphi XE6 区分 Firemonkey TListView 项目上的 OnClick 和 Swipe

android - HttpURLConnection 抛出异常

java - java中httpResponse返回null

android - EditText 选择器的名称是什么,如何更改它? (含图片)

android - 试图在android中绘制一些简单的线条

android - 为一个小部件设置 AppWidget 背景也会影响其他小部件

android - 通知监听服务 : detect if application is allowed to listen for notification

java - 无法使用android studio向MySQL数据库插入数据

java - 如何在Java(Android)中将字节数组列表作为json参数发送?