当前位置: 首页 > news >正文

驾校门户网站模板网站的子域名

驾校门户网站模板,网站的子域名,网站建设第一步怎么弄,海城区建设局网站android编译时注解#xff0c;老生常谈#xff0c;外面的例子都是bindView#xff0c;脑壳看疼了#xff0c;自己学习和编写下。 而且现在已经进化到kotlin2.0#xff0c;google也逐渐放弃kapt#xff0c;进入维护状态。所以要好好看看本贴。 参考我的工程#xff1a; h…android编译时注解老生常谈外面的例子都是bindView脑壳看疼了自己学习和编写下。 而且现在已经进化到kotlin2.0google也逐渐放弃kapt进入维护状态。所以要好好看看本贴。 参考我的工程 https://github.com/jzlhll/AndroidComponts ClassNameAnnotations ClassNameAnnotations-compiler ClassNameAnnotations-ksp app 四个模块。 一、编写kaptabstractProcessor 1. 新建注解的模块注意是java/kotlin library 配置build.gradle plugins {id java-libraryid kotlin }java {sourceCompatibility JavaVersion.VERSION_17targetCompatibility JavaVersion.VERSION_17 }添加自定义注解的java类 Retention(RetentionPolicy.CLASS) Target(value ElementType.TYPE) public interface EntroFrgName { }这是我的需求目的就是标记一个类用来收集所有标注了注解的类把他们收集成一个List。 2.再创建compiler模块也是java/kotlin library: 得到2个模块。 2.1 gradle plugins {id java-libraryid kotlin }java {sourceCompatibility JavaVersion.VERSION_17targetCompatibility JavaVersion.VERSION_17 }dependencies {implementation project(:ClassNameAnnotations) }2.2 配置解析器辅助文件 这一步可以通过autoservice来配置。查看文章末尾注意事项。 在main下面reosurces/META-INF/services/目录下创建文件javax.annotation.processing.Processor 里面写上com.au.learning.classnamecompiler.MyProcessor 就是下面代码MyProcessor 的类路径。 2.3 编写注解解析代码 class MyProcessor : AbstractProcessor() {private var processingEnv:ProcessingEnvironment? nulloverride fun init(processingEnv: ProcessingEnvironment?) {super.init(processingEnv)this.processingEnv processingEnvprocessingEnv?.messager?.printMessage(Diagnostic.Kind.WARNING, init...!)}/*** 所支持的注解合集*/override fun getSupportedAnnotationTypes(): MutableSetString {return mutableSetOf(EntroFrgName::class.java.canonicalName)}private fun isElementInAnnotations(target:Element, annotations: SetTypeElement) : Boolean {for (annotation in annotations) {//匹配注释if (target annotation) {return true}}return false}//Element代表程序中的包名、类、方法。即注解所支持的作用类型。fun getMyElements(annotations: SetTypeElement, elements: SetElement?): SetTypeElement {val result: MutableSetTypeElement HashSet()//遍历包含的 package class methodfor (element in elements) {//匹配 class or interfaceif (element is TypeElement) {for (annotationMirror in element.annotationMirrors) {val found isElementInAnnotations(annotationMirror.annotationType.asElement(), annotations)if (found) {result.add(element)break}}}}return result}/*** param annotations 需要处理的注解 即getSupportedAnnotationTypes被系统解析得到的注解* param roundEnv 注解处理器所需的环境帮助进行解析注解。*/override fun process(annotations: MutableSetout TypeElement?, roundEnv: RoundEnvironment?): Boolean {val elements roundEnv?.rootElements?.let {if (annotations ! null) {getMyElements(annotations, it)} else {null}}val names AllEntroFragmentNamesTemplate()if (!elements.isNullOrEmpty()) {for (e in elements) {names.insert(e.qualifiedName.toString())}val code names.end()processingEnv.filer?.let {try {// 创建一个JavaFileObject来表示要生成的文件val sourceFile: JavaFileObject it.createSourceFile(com.allan.androidlearning.EntroList, null)sourceFile.openWriter().use { writer -// 写入Java或Kotlin代码writer.write(code)writer.flush()}} catch (e: IOException) {processingEnv.messager.printMessage(Diagnostic.Kind.ERROR, Failed to generate file: e.message)}}}return true}//一定要修改这里避免无法生效override fun getSupportedSourceVersion(): SourceVersion {return SourceVersion.latestSupported()} }class AllEntroFragmentNamesTemplate : AbsCodeTemplate() {private val insertCode StringBuilder()/*** com.allan.androidlearning.activities.LiveDataFragment.class*/fun insert(javaClass:String) {insertCode.append(list.add().append(javaClass).append(.class);).appendLine()}fun end() : String {return codeTemplate.replace(//insert001, insertCode.toString())}override val codeTemplate package com.allan.androidlearning;import androidx.fragment.app.Fragment;import java.util.ArrayList; import java.util.List;public class EntroList {public ListClass? extends Fragment getEntroList() {ListClass? extends Fragment list new ArrayList();//insert001return list;} }.trimIndent() }这里有2个可以进一步学习的东西一是auto库帮你生成META-INF文件。 二是通过javapoet来生成文件。详细在文章末尾注意事项。 本质上APT的目的就是将未知的代码写成一个具体的类被现有代码去调用我自然可以直接写出这个类。所以我为了方便和减少学习成本自行整了一个模版代码这个模版代码可以自己写好一个类拷贝到string codeTemplate把生成部分通过string.replace处理即可。然后简单地通过processingEnv.filer.createSourceFilewrite就可以完成自认为是一个不错的办法。 3. 主工程 剩下就简单了app/build.gradle修改 plugins {id com.android.applicationid org.jetbrains.kotlin.androidid kotlin-kapt //添加}...//注解引如implementation project(:ClassNameAnnotations)//kotlinkapt project(:ClassNameAnnotations-compiler)//java工程换成annotationProcessor //annotationProcessor project(:ClassNameAnnotations-compiler)给代码添加自己的注解了 EntroFrgName class CanvasFragment : ViewFragment() {EntroFrgName class DialogsFragment : ViewFragment() {编译 调试过程可以选择gradle-Tasks-other-kaptDebugKotlin来编译。比直接编译更快更单一。 编译结果在 再最后把这个类拿去类似BuildConfig一样去调用了。至此已经完成。 二、app模块是java工程 自然是用不了ksp的。 唯一修改是app/build.gradle //java工程换成annotationProcessor annotationProcessor project(:ClassNameAnnotations-compiler)然后各个gradle中无需kotlin相关的痕迹。略。 三、KSP 终于谈到ksp了。 跟上面kapt一样创建2个java/kotlin的模块。一个注解模块一个处理模块那个灰色的compiler代表着settings.gradle已经不加载不使用不管它。 注解模块的注解可以使用kotlin的注解类也可以继续使用java的注解类。 区别只是在provider的解析代码上有一点点区别 //EntroFrgName是java的注解类 resolver.getSymbolsWithAnnotation(EntroFrgName::class.java.canonicalName) //EntroFrgName是kotlin的注解类 resolver.getSymbolsWithAnnotation(EntroFrgName::class.qualifiedName!!)1. gradle 根目录的build.gradle添加 plugins {id com.android.application version 8.4.2 apply falseid com.android.library version 8.4.2 apply falseid org.jetbrains.kotlin.android version 1.9.24 apply falseid com.google.devtools.ksp version 1.9.24-1.0.20 apply false }ksp模块的build.gradle为: plugins {id java-libraryid kotlin }java {sourceCompatibility JavaVersion.VERSION_17targetCompatibility JavaVersion.VERSION_17 }dependencies {implementation project(:ClassNameAnnotations)implementation(com.google.devtools.ksp:symbol-processing-api:1.9.24-1.0.20) }注意kotlin.android, devtools.ksp与symbol-processing-api三者的版本对应查看https://github.com/google/ksp/releases。 2. 配置解析器辅助文件 src/main/resources/META-INF/services/目录下 com.google.devtools.ksp.processing.SymbolProcessorProvider 文件。写下如下的名字。 com.au.learning.classnamecompiler.AllEntroFrgNamesProvider。就是下面的类名。 3. provider解析代码 class AllEntroFrgNamesProvider : SymbolProcessorProvider{override fun create(environment: SymbolProcessorEnvironment): SymbolProcessor {return TestKspSymbolProcessor(environment)} }/*** creator: lt 2022/10/20 lt.dygzsqq.com* effect : ksp处理程序* warning:*/ class TestKspSymbolProcessor(private val environment: SymbolProcessorEnvironment) : SymbolProcessor {// 使用一个集合来跟踪已经处理过的符号private val processedSymbols mutableSetOfKSDeclaration()override fun process(resolver: Resolver): ListKSAnnotated {environment.logger.warn(process start....)val symbols resolver.getSymbolsWithAnnotation(EntroFrgName::class.java.canonicalName)val ret mutableListOfKSAnnotated()val allEntroFragmentNamesTemplate AllEntroFragmentNamesTemplate()var hasMy falsesymbols.toList().forEach { symbol-if (!symbol.validate())ret.add(symbol)else {if (symbol is KSClassDeclaration symbol.classKind ClassKind.CLASS) {val qualifiedClassName symbol.qualifiedName?.asString()allEntroFragmentNamesTemplate.insert(qualifiedClassName!!)hasMy true // symbol.accept(TestKspVisitor(environment), Unit)//处理符号} else {ret.add(symbol)}}}if (hasMy) {val code allEntroFragmentNamesTemplate.end()// 生成文件val file environment.codeGenerator.createNewFile(dependencies Dependencies(false),packageName com.allan.androidlearning,fileName EntroList)// 写入文件内容OutputStreamWriter(file).use { writer -writer.write(code)}}//返回无法处理的符号return ret} }4. 主工程app引入 类似前面kapt的主工程app/build.gradle plugins {id com.android.applicationid org.jetbrains.kotlin.androidid com.google.devtools.ksp }implementation project(:ClassNameAnnotations)ksp project(:ClassNameAnnotations-ksp)添加注解编译后最终生成的代码在 注意事项 1. 注意点 1.1 打印日志用warn。android studio编译是默认不打印低级别的。 //Processor processingEnv?.messager?.printMessage(Diagnostic.Kind.WARNING, init...!) //ksp environment.logger.warn(process start....)1.2 kapt已经逐渐放弃kt2.0开始不再努力维护kapt。尽量迁移ksp。更快更有支持。 1.3 很多人使用glide经常把kaptannotationProcessorksp搞混。 我们可以看到glide库 它也是有2个process的模块的一个是给老的kapt或者javaannotationProcessor处理。一个是给ksp。我们如出一辙。 2. 进一步学习 第一个 使用autoservice来自动注解MyProcessor 让它帮我们生成META-INF里面的文件。这个autoservice就干这么点点事情。compiler这个模块添加gradle自己在这里看最新版本https://github.com/google/auto annotationProcessor com.google.auto.service:auto-service:1.11.0implementation com.google.auto.service:auto-service-annotations:1.11.0然后给我们的Processor类添加上注解 AutoService(value {Processor.class})这纯属于是我还没有编写完自己的注解 就已经使用上别的注解来给我的注解模块生成文件了。[手动狗头]。 第二个使用javapoet来实现生成代码。需要自行了解他的api和class函数的结构。有点学习成本。 3. 坑了一天 出现一个问题始终找不到原因。原来是 META-INF下面是目录services再放一个文件。之前搞成了META-INF.services这个错误的目录 而studio中显示的却跟包名一样。导致ksp的时候搞了好久一直编译不过提示[ksp] No providers found in processor classpath。好在有这句话终于在ksp下解决了之后反推到kapt也解决了。之前搞kapt怎么都搞不好也没有提示。
http://www.w-s-a.com/news/903437/

相关文章:

  • 安徽做网站公司哪家好建设网站需要什么内容
  • 哪些网络公司可以做机票预订网站网站新闻后台怎么做
  • 微网站 域名企业网站怎么做推广
  • 兴安盟住房和城乡建设部网站在国外做网站
  • 南雄市建设局网站搜索关键词的方法
  • 网站建设维护工作经验深圳定制展会
  • 新闻类网站备案WordPress评论昵称显示错误
  • 如何建立一个个人网站自己做一个购物网站
  • 吴忠网站建设公司中国建筑股份有限公司 官网
  • 深圳电商网站开发公司page list wordpress
  • 长安外贸网站建设顺德区网站设计建设企业
  • 临沂市建设局网站简介专业建设网站开发
  • 肇庆网站制作设计中国企业500强招聘
  • 苏州厂房装修宁波seo网络推广外包报价
  • 文山知名网站建设惠州哪家做网站好
  • 物流网站风格网站登录密码保存在哪里设置
  • 免费网站怎么建立icodepython基础教程
  • 无障碍网站建设方案wordpress 任务管理系统
  • iis5.1发布网站中小企业网络营销存在的问题研究论文
  • 阳泉软件定制网站建设网站可以做多语言的吗
  • 建设网站的目的及功能定位主要包括哪些内容百度关键词优化
  • 开一个小程序要多少钱宁波seo网络推广外包报价
  • 网站备案最新备案号电子商务网站建设的规章制度
  • wordpress制作单页网站导航页面鞍山信息港招聘信息
  • 屏蔽ip地址访问网站自己做衣服的网站
  • 网站建设 域名业务 邮箱哪里有网站建设中心
  • 免费网站赚钱重庆建设摩托车股份有限公司
  • 合肥水运建设工程监理网站自己买服务器能在wordpress建网站
  • wordpress积分商城主题整站seo排名要多少钱
  • 鲜花网站建设的利息分析网站设计与制作专业