首页 > 其他分享 >android studio配置apt 使用Annotation

android studio配置apt 使用Annotation

时间:2024-12-12 16:55:18浏览次数:10  
标签:writer apt write handler studio module Handler android class

1、生成类的Processor必须在类型为“Java or Kotlin Library"的module下,如果没有,则需要新建一个[原因是需要引入

[javax.annotation.processing]包,这个包是jre下面的,只有在这种类型的Module下才能引入。

 2、实现

AbstractProcessor的方法,代码示例如下:
@AutoService(Processor.class)
public class HandlerProcessor extends AbstractProcessor {


@Override
public synchronized void init(ProcessingEnvironment processingEnv) {
super.init(processingEnv);
//注解处理器提供的API
processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, "HandlerProcessor init");
}

@Override
public Set<String> getSupportedAnnotationTypes() {
Set<String> hashSet = new HashSet<>();
hashSet.add(Handler.class.getCanonicalName());
return hashSet;
}
/**
* 编译版本,固定写法就可以
*/
@Override
public SourceVersion getSupportedSourceVersion() {
return processingEnv.getSourceVersion();
}


/**
* 扫描注解回调
*/
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
//拿到所有添加Handler注解的成员变量
Set<? extends Element> elements = roundEnv.getElementsAnnotatedWith(Handler.class);
if(elements.size() == 0 ) {
return false;
}
Element firstEle = elements.stream().findAny().get();
Handler firstHandler = firstEle.getAnnotation(Handler.class);
String packageName = firstHandler.pakcageName();
String pakcage = "com.nhzero.connection.handler";
String simpleClsName = "ConnectionHandlerRegister";
String className = "com.nhzero.connection.handler.ConnectionHandlerRegister";
if(packageName.contains("device")) {
className = "com.nhzero.device.handler.DeviceHandlerRegister";
pakcage = "com.nhzero.device.handler";
simpleClsName = "DeviceHandlerRegister";
}
try {
JavaFileObject fileObject = processingEnv.getFiler().createSourceFile(className);
Writer writer = fileObject.openWriter();
writer.write("package " + pakcage + ";\n");
writer.write("import com.nhzero.connection.HandlerContext;\n");
writer.write("import com.nhzero.connection.handler.MessageHandler;\n");

for (Element element : elements) {
Name simpleName = element.getSimpleName();
Handler handler = element.getAnnotation(Handler.class);
writer.write("import " + handler.pakcageName() + "." + simpleName + ";\n");
}

writer.write("public class " + simpleClsName + " {\n");
writer.write(" public static void init() {\n");

int i = 0;
for (Element element : elements) {
//拿到成员变量名
Name simpleName = element.getSimpleName();
Handler handler = element.getAnnotation(Handler.class);
//输出成员变量名
processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, simpleName);
if(handler.hasGetInstance()) {
writer.write(" MessageHandler handler" + i + " = " + simpleName + ".getInstance();\n");
} else {
writer.write(" MessageHandler handler" + i + " = new " + simpleName + "();\n");
}

writer.write(" HandlerContext.addHandler(handler" + i + ", MessageHandler.class, " +
(handler.isMultiple()? "e -> e.supportTypes())": "e -> e.supportType())") + ";\n");
i++;
}
writer.write(" }\n");
writer.write("}\n");
writer.flush();
writer.close();
} catch (Exception e) {
}


return false;
}



}

3、上述生成类的HandlerProcessor 所在的module的gradle文件

plugins {
id 'java-library'
}

java {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}

dependencies {
compileOnly 'com.google.auto.service:auto-service:1.0-rc6'
annotationProcessor 'com.google.auto.service:auto-service:1.0-rc6'
}

//java控制台输出中文乱码
tasks.withType(JavaCompile) {
options.encoding = "UTF-8"
}

4、其他module引入上述module
implementation project(':base:apt')
annotationProcessor project(path: ':base:apt')
annotationProcessor 是用于注解扫描,
implementation 是用于引入上面module中定义的Handler注解,这个例子是把注解类和Processor类放在了同一个module下面。

5、特别要注意的
module引入annotationProcessor project(path: ':base:apt') 只能扫描当前module下的加注解的类,而不能扫描引入的其他jar包或其他module下带注解的类

标签:writer,apt,write,handler,studio,module,Handler,android,class
From: https://www.cnblogs.com/qiyu/p/18602949

相关文章

  • Android原生方法几行代码实现对人像进行切割,Android图片人像分离,可更换背景或者透明背
    前言调研了好几天,网上大多数是需要收费的API接口,在准备付费购买接口的时候,一篇文章给我带来了希望Android------开源的Modnet算法实现抠图和更换背景再次感谢作者的分享效果图原作者的代码是无法切出透明背景的,我的项目需求是上传图片识别人像,更换背景变成景点,纯......
  • Android Studio 引用framework.jar方法
    参考文章:[Android][踩坑]AndroidStudio导入framework.jar的各种坑_android_RyanZHENG-开放原子开发者工作坊本文只对以下环境进行说明,其他环境参考上面文章开发环境:平台:RK3576 Android14JDK版本:JDK17AS版本:Jellyfish |2023.3.1Patch1gradle版本:8.0.1步骤:1、找......
  • Linux—软件包管理中APT工具详解
    本文为UbuntuLinux操作系统-第11弹~~今天接着讲昨天没讲完的知识点,主要内容是Linux软件包管理中的APT工具的详细运用知识~上期回顾:Linux—软件包管理概念及Deb软件包使用更多Linux相关内容点击......
  • echo "your_password" | sudo -S apt-get update
    `sudo-S`是`sudo`命令的一个选项,它指示`sudo`从标准输入(stdin)读取密码,而不是从终端提示用户输入。通常情况下,当你使用`sudo`执行一个需要提升权限的命令时,它会在终端中弹出一个交互式的提示,要求你输入密码。而使用`-S`选项可以让`sudo`接受通过管道或其他方式传递过来......
  • RK3588主板/开发板Android12系统APK签名文件生成的方法,干货满满
    本文介绍瑞芯微RK3588主板/开发板Android12系统下,APK签名文件生成方法。触觉智能EVB3588开发板演示,搭载了瑞芯微RK3588芯片,该开发板是核心板加底板设计,音视频接口、通信接口等各类接口一应俱全,可帮助企业提高产品开发效率,缩短上市时间,降低成本和设计风险。工具准备下载Keytool-I......
  • Django-simple-captcha实现图片和输入框的样式
    django验证码的插件一、安装pipinstalldjango-simple-captcha二、配置和安装settting.py在INSTALLED_APPS,添加captcha在末尾增加captcha增加如下配置:CAPTCHA_IMAGE_SIZE=(120,50)#图片大小CAPTCHA_BACKGROUND_COLOR='#FFFFFF'CAPTCHA_CHALLENGE_FUN......
  • Captcha生成验证码并验证输入正误_HTML5 Canvas 实现(完整代码)
    在浏览器端实现生成验证码并验证输入正误,使用HTML5Canvas来实现。以下是一个简单的浏览器端验证码实现示例:```html<!DOCTYPEhtml><html><head>  <title>BrowserCaptcha</title>  <style>    .captcha-container{      displa......
  • Android 网络框架的封装(暂定)
    参考一下,不能直接运行的工具类importandroid.app.Application;importandroid.content.Context;importandroid.text.TextUtils;importjava.io.File;importjava.io.InputStream;importjava.net.Proxy;importjava.util.concurrent.Executor;importjava.util.concur......
  • WhaleStudio Demo:如何从Aurora CDC 实时数据同步到Redshift详细演示
    视频演示:https://weixin.qq.com/sph/AQ0oGKk12今天我将向大家详细介绍如何使用WhaleStudio将数据从AuroraCDC(ChangeDataCapture)实时同步至Redshift的功能。这是一个强大的数据同步功能,它支持多种数据源,包括文件、非结构化数据以及多样化的接口。数据支持范围首先,Whale......
  • Android可长按拖拽item的列表
    Android可长按拖拽item的列表仿支付宝拖拽效果,长按拖拽item列表,自动换位一、思路:自定义控件DragGridView二、效果图:看视频更直观点:Android轮子-可长按拖拽item的列表三、关键代码:packagecom.cong.mydraglistapp.drag;importandroid.animation.Animator;......