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

网站名称 规则技术支持 石家庄网站建设

网站名称 规则,技术支持 石家庄网站建设,物流公司,民制作网站哪家便宜上一篇文章简单讲了下Java注解的学习之元注解说明#xff0c;学习了Java注解是如何定义的#xff0c;怎么使用的#xff0c;但是并没有介绍Java的注解是怎么起作用的#xff0c;像Spring Boot里面的那些注解#xff0c;到底是怎么让程序这样子运行起来的#xff1f;特别是…上一篇文章简单讲了下Java注解的学习之元注解说明学习了Java注解是如何定义的怎么使用的但是并没有介绍Java的注解是怎么起作用的像Spring Boot里面的那些注解到底是怎么让程序这样子运行起来的特别是讲到RetentionPolicy这一块到底在SOURCE阶段在CLASS阶段在RUNTIME阶段有什么差别注解是如何在这三个阶段起作用的呢而且在SOURCE阶段在CLASS阶段程序又不运行那注解到底会用来做些什么呢带着这些疑问我就去了解下了如何让注解起作用发现RUNTIME阶段的介绍到处都是但是SOURCE和CLASS阶段就很少文章讲解到了真的得搜刮好几十篇文章才能成功的把程序跑起来几乎每一篇文章都少讲了些东西。本文优先讲的是SOURCE阶段注解如何发挥作用发现这一块涉及的知识非常多且难资料还少另外还发现Java服务器端编程的人用这个反而不如Android开发的人用得多。对我学习SOURCE阶段的注解帮助最大的是Pluggable Annotation Processing APIJSR269插件化注解API以及JVM进阶 -- 浅谈注解处理器。搜索这方面的资料用“插件化注解处理API”这个关键词能搜得更全。这几篇文章基本上把SOURCE阶段的注解实现和使用讲了但是具体细节比如用javac直接编译运行代码javac使用jar包使用maven等三个方式如何运行注解处理器倒是基本上蜻蜓点水摸索了我好久才搞定了。关于注解处理器的知识可以从如上三篇文章了解本文主要讲注解的定义和运行。我用的代码是摘抄至 JVM进阶 -- 浅谈注解处理器 它定义了一个CheckGetter的注解用来检查一个类里面的字段哪个没有Getter方法没有的话编译就报错。不过我的和他的稍稍不同他的代码定义没有放到package里面我的放到package里面了这样子的使用和执行又有了点不同。首先定义CheckGetter注解package com.shahuwang.processor;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;Target({ElementType.TYPE, ElementType.FIELD})Retention(RetentionPolicy.SOURCE)public interface CheckGetter {}注意上面的代码是放到 package com.shahuwang.processor 里面的因此先创建如下结构的文件夹Processor—— com—— shuhuwang—— processor—— CheckGetter.java注解已经定义好了现在先来用一下这个注解package com.shahuwang.processor;CheckGetterpublic class TestGetter {String name;String first;public String getName(){return this.name;}}这个类有两个字段但是有一个字段没有设置getter。下面才是真正重要的代码就是让CheckGetter这个注解真正能运行起来发挥作用package com.shahuwang.processor;import javax.annotation.processing.AbstractProcessor;import javax.annotation.processing.RoundEnvironment;import javax.annotation.processing.SupportedAnnotationTypes;import javax.annotation.processing.SupportedSourceVersion;import javax.lang.model.SourceVersion;import javax.lang.model.element.ExecutableElement;import javax.lang.model.element.Modifier;import javax.lang.model.element.TypeElement;import javax.lang.model.element.VariableElement;import javax.lang.model.util.ElementFilter;import javax.tools.Diagnostic;import javax.lang.model.element.Element;import java.util.Set;// 这个地方换了包名就需要改过来否则processor就不会执行了, 这里是最需要注意的地方千万注意SupportedAnnotationTypes(com.shahuwang.processor.CheckGetter)SupportedSourceVersion(SourceVersion.RELEASE_11)public class CheckGetterProcessor extends AbstractProcessor {Overridepublic boolean process(Set extends TypeElement annotations, RoundEnvironment roundEnv) {for (TypeElement annotatedClass : ElementFilter.typesIn(roundEnv.getElementsAnnotatedWith(CheckGetter.class))) {for (VariableElement field : ElementFilter.fieldsIn(annotatedClass.getEnclosedElements())) {if(!containsGetter(annotatedClass, field.getSimpleName().toString())){processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR,String.format(getter not found for %s.%s., annotatedClass.getSimpleName(), field.getSimpleName()));}}}return false;}private static boolean containsGetter(TypeElement typeElement, String name){String getter get name.substring(0, 1).toUpperCase() name.substring(1).toLowerCase();for(ExecutableElement executableElement: ElementFilter.methodsIn(typeElement.getEnclosedElements())){if(!executableElement.getModifiers().contains(Modifier.STATIC) executableElement.getSimpleName().toString().equals(getter) executableElement.getParameters().isEmpty()){return true;}}return false;}}上面这段代码要理解的概念有点儿多实际上我现在也不是很懂但是本文的目标是先让注解处理器跑起来所以先不管。这里最重要也是折磨我最惨的地方就是这一句SupportedAnnotationTypes(com.shahuwang.processor.CheckGetter)你定义的注解在哪个package下这里就要写完整了如果写错了注解处理器就不起作用了。现在在Processor目录下打开命令行先编译CheckGetterProcessor.java javac com/shahuwang/processor/CheckGetterProcessor.java编译好之后就可以使用了再执行命令javac -processor com.shahuwang.processor.CheckGetterProcessor com/shahuwang/processor/TestGetter.java便可以看到这样的提示错误: getter not found for TestGetter.first.上面这种方式需要每次执行编译的时候指定一下processor才能做到检查作用那如果在团队开发中希望自动执行一些检查那可以用SPI 服务提供者发现机制或者maven来实现。SPI 服务提供者发现机制就是配置META-INF文件夹和里面的文件告诉Java你要执行某个东西这个东西的路径在哪里。再把编译好的processor和META-INF打包成jar包就可以很方便使用了。文件夹和文件结构如下processor-com-shahuwang- processor- CheckGetterProcessor.class-META-INF-services- javax.annotation.processing.Processor编译方式和上述一样。javax.annotation.processing.Processor是一个普通的文本就是告知java一些关于注解处理器的配置里面的内容如下com.shahuwang.processor.CheckGetterProcessor就是告知这个注解处理器要用哪些个如果有多个的话可以一行一个。然后在processor目录下执行指令jar -cvf processor.jar com META-INF, 形成了一个 processor.jar 的包此时可以执行指令javac -cp processor.jar com/shahuwang/processor/TestGetter.java就会自动执行注解处理器检查字段有没有getter方法了。jar包的这个方法其实是把注解和注解的实现单独放一块作为一个插件来使用了maven也是如此的。现实的开发中还是用maven最多先用指令创建一个maven项目mvn archetype:generate -DgroupIdcom.shahuwang -DartifactIdProcessor -Dpackagecom.shahuwang.processor然后在pom.xml的层级下添加如下配置UTF-8UTF-81.81.81.8org.apache.maven.pluginsmaven-compiler-plugin3.5.11.81.8UTF-8com.shahuwang.processor.CheckGetterProcessor代码目录结构如下Processor- src- main- java-com-shahuwang-processor-CheckGetter.java-CheckGetterProcessor.java- pom.xml然后Processor目录下执行 mvn clean install, 这个项目就会被安装到本地的maven库里面。再用maven新建一个TestProcessor项目项目结构如下TestProcessor- src- main- java-com-shahuwang-TestGetter.java- pom.xmlTestGetter.java 的代码上面有。修改pom.xml, 先在 下添加UTF-8UTF-81.81.81.8org.apache.maven.pluginsmaven-compiler-plugin3.5.11.81.8UTF-8com.shahuwang.processor.CheckGetterProcessor再在dependencies添加com.shahuwangProcessor1.0-SNAPSHOT也就是引入上面编译好的处理器的包。现在在TestProcessor目录下执行mvn compile就会看到熟悉的提示错误: getter not found for TestGetter.first.三种主流的注解处理器使用方式现在都搞懂怎么使用了。下一篇文章将会关注注解处理器的使用方法各个注解处理器API的使用
http://www.zqtcl.cn/news/515453/

相关文章:

  • 专门做私人定制旅游的网站专做韩餐网站
  • 网站 续费wordpress首页调用指定分类
  • 2008系统怎么做网站免费设计软件下载
  • 做电音的软件的专业下载网站宁波俄语网站建设
  • 北?? 网站建设旅游手机网站开发
  • 乐清做网站的网站备案容易通过吗
  • 网站qq登录 开发一个小型网站开发成本
  • 湖北网络建设公司网站js跳转到别的网站
  • 郑州网站app开发的汽车网站 源码
  • 河南网站建设企业做网站多少钱西宁君博示范
  • 沈阳有做网站的吗青浦手机网站制作
  • 腾讯云免费建站建立一个网站英语
  • 沙漠风网站建设怎么样官方网站建设银行2010年存款利息
  • 360报危险网站微信代码小程序
  • 网站维护报价单国外 做励志视频的网站
  • 用源码做自己的网站公司网站建设哪家公司好
  • 网站运营做seohtml前端网站开发PPT
  • 上海网站定制设计图wordpress网站在线安装
  • 互动网站的核心技术wordpress不用插件
  • 厦门市建设工程交易中心网站怎么自己做游戏软件的app
  • 网站论文参考文献人力资源公司名称大全简单大气
  • 射阳做企业网站哪家好wordpress 进销存
  • 青海个人旅游网站建设wordpress用户名密码加密方式
  • 安徽平台网站建设找哪家wordpress首页加登录
  • 雅安市住房和城乡建设局网站湖南全程电子化服务平台官网
  • dw做的上传网站打不开网页制作培训价格
  • 工程网站怎么做广州做网站平台
  • 成都网站建设 全美深圳定制网站建设
  • 邢台网站建设与制作陕西高速公路建设集团网站
  • 太原 招聘 网站建设 技术经理关于 建设 二级网站