有没有办法在编译的时候生成代码。
例如:
我写了一个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/