解释器android,编写android 注解解释器

@AutoService(Processor.class)

public class RouterProcessor extends AbstractProcessor {

private Filer mFiler;

private Messager mMessager;

private Map mStaticRouterMap = new HashMap<>();

private List mAutoRouterList = new ArrayList<>();

@Override

public synchronized void init(ProcessingEnvironment processingEnvironment) {

super.init(processingEnvironment);

mFiler = processingEnvironment.getFiler();

mMessager = processingEnvironment.getMessager();

}

@Override

public SourceVersion getSupportedSourceVersion() {

return SourceVersion.latestSupported();

}

@Override

public Set getSupportedAnnotationTypes() {

Set set = new HashSet<>();

set.add(AutoRouter.class.getCanonicalName());

set.add(StaticRouter.class.getCanonicalName());

set.add(Component.class.getCanonicalName());

set.add(Components.class.getCanonicalName());

return set;

}

@Override

public boolean process(Set extends TypeElement> set, RoundEnvironment roundEnvironment) {

mStaticRouterMap.clear();

mAutoRouterList.clear();

try {

Set extends Element> mainAppElement = roundEnvironment.getElementsAnnotatedWith(Components.class);

if (!mainAppElement.isEmpty()) {

processInstaller(mainAppElement);

return true;

}

processComponent(roundEnvironment);

} catch (Exception e) {

mMessager.printMessage(Diagnostic.Kind.ERROR, e.getMessage());

}

return true;

}

private void processInstaller(Set extends Element> mainAppElement) throws IOException {

TypeElement typeElement = (TypeElement) mainAppElement.iterator().next();

JavaFileObject javaFileObject = mFiler.createSourceFile(Config.ROUTER_MANAGER, typeElement);

PrintWriter writer = new PrintWriter(javaFileObject.openWriter());

writer.println("package " + Config.PACKAGE_NAME + ";");

writer.println("public class " + Config.ROUTER_MANAGER + " {");

writer.println("public static void " + Config.ROUTER_MANAGER_METHOD + "() {");

Components componentsAnnotation = typeElement.getAnnotation(Components.class);

String[] components = componentsAnnotation.value();

for (String item : components) {

writer.println(Config.FILE_PREFIX + item + ".router();");

}

writer.println("}");

writer.println("}");

writer.flush();

writer.close();

}

private void processComponent(RoundEnvironment roundEnvironment) throws Exception {

Set extends Element> compElements = roundEnvironment.getElementsAnnotatedWith(Component.class);

if (compElements.isEmpty()) { return;}

Element item = compElements.iterator().next();

String componentName = item.getAnnotation(Component.class).value();

Set extends Element> routerElements = roundEnvironment.getElementsAnnotatedWith(StaticRouter.class);

for (Element e : routerElements) {

if (! (e instanceof TypeElement)) { continue;}

TypeElement typeElement = (TypeElement) e;

String pattern = typeElement.getAnnotation(StaticRouter.class).value();

mStaticRouterMap.put(pattern, typeElement.getQualifiedName().toString());

}

Set extends Element> autoRouterElements = roundEnvironment.getElementsAnnotatedWith(AutoRouter.class);

for (Element e : autoRouterElements) {

if (!(e instanceof TypeElement)) { continue;}

TypeElement typeElement = (TypeElement) e;

mAutoRouterList.add(typeElement.getQualifiedName().toString());

}

writeComponentFile(componentName);

}

private void writeComponentFile(String componentName) throws Exception {

String className = Config.FILE_PREFIX + componentName;

JavaFileObject javaFileObject = mFiler.createSourceFile(className);

// javaFileObject.delete();

PrintWriter printWriter = new PrintWriter(javaFileObject.openWriter());

printWriter.println("package " + Config.PACKAGE_NAME + ";");

printWriter.println("import android.app.Activity;");

printWriter.println("import android.app.Service;");

printWriter.println("import android.content.BroadcastReceiver;");

printWriter.println("public class " + className + " {");

printWriter.println("public static void router() {");

// // Router.router(ActivityRule.ACTIVITY_SCHEME + "shop.main", ShopActivity.class);

for(Map.Entry entry : mStaticRouterMap.entrySet()) {

printWriter.println("org.loader.router.Router.router(\"" + entry.getKey()

+"\", "+entry.getValue()+".class);");

}

for (String klass : mAutoRouterList) {

printWriter.println("if (Activity.class.isAssignableFrom(" + klass + ".class)) {");

printWriter.println("org.loader.router.Router.router(org.loader.router.rule.ActivityRule.ACTIVITY_SCHEME + \""

+klass+"\", " + klass + ".class);");

printWriter.println("}");

printWriter.println("else if (Service.class.isAssignableFrom(" + klass + ".class)) {");

printWriter.println("org.loader.router.Router.router(org.loader.router.rule.ServiceRule.SERVICE_SCHEME + \""

+klass+"\", " + klass + ".class);");

printWriter.println("}");

printWriter.println("else if (BroadcastReceiver.class.isAssignableFrom(" + klass + ".class)) {");

printWriter.println("org.loader.router.Router.router(org.loader.router.rule.ReceiverRule.RECEIVER_SCHEME + \""

+klass+"\", "+klass+".class);");

printWriter.println("}");

}

printWriter.println("}");

printWriter.println("}");

printWriter.flush();

printWriter.close();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值