如果没有用来读取注解的方法和工作,那么注解也就不会比注释更有用处了。使用注解的过程中,很重要的一部分就是创建于使用注解处理器。Java SE5扩展了反射机制的API,以帮助程序员快速的构造自定义注解处理器。
注解处理器类库(java.lang.reflect.AnnotatedElement):
Java使用Annotation接口来代表程序元素前面的注解,该接口是所有Annotation类型的父接口。除此之外,Java在 java.lang.reflect 包下新增了AnnotatedElement接口,该接口代表程序中可以接受注解的程序元素,该接口主要有如下几个实现类:
Class:类定义
Constructor:构造器定义
Field:累的成员变量定义
Method:类的方法定义
Package:类的包定义
java.lang.reflect 包下主要包含一些实现反射功能的工具类,实际上,java.lang.reflect 包所有提供的反射API扩充了读取运行时Annotation信息的能力。当一个Annotation类型被定义为运行时的Annotation后,该注 解才能是运行时可见,当class文件被装载时被保存在class文件中的Annotation才会被虚拟机读取。
AnnotatedElement 接口是所有程序元素(Class、Method和Constructor)的父接口,所以程序通过反射获取了某个类的AnnotatedElement对 象之后,程序就可以调用该对象的如下四个个方法来访问Annotation信息:
方法1:<T extends Annotation> T getAnnotation(Class<T> annotationClass): 返回改程序元素上存在的、指定类型的注解,如果该类型注解不存在,则返回null。
方法2:Annotation[] getAnnotations():返回该程序元素上存在的所有注解。
方法3:boolean is AnnotationPresent(Class<?extends Annotation> annotationClass):判断该程序元素上是否包含指定类型的注解,存在则返回true,否则返回false.
方法4:Annotation[] getDeclaredAnnotations():返回直接存在于此元素上的所有注释。与此接口中的其他方法不同,该方法将忽略继承的注释。(如果没有 注释直接存在于此元素上,则返回长度为零的一个数组。)该方法的调用者可以随意修改返回的数组;这不会对其他调用者返回的数组产生任何影响。
一个简单的注解处理器:
/***********注解声明***************/ /** * 水果名称注解 * @author peida * */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface FruitName { String value() default ""; } /** * 水果颜色注解 * @author peida * */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface FruitColor { /** * 颜色枚举 * @author peida * */ public enum Color{ BULE,RED,GREEN}; /** * 颜色属性 * @return */ Color fruitColor() default Color.GREEN; } /** * 水果供应者注解 * @author peida * */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface FruitProvider { /** * 供应商编号 * @return */ public int id() default -1; /** * 供应商名称 * @return */ public String name() default ""; /** * 供应商地址 * @return */ public String address() default ""; } /***********注解使用***************/ public class Apple { @FruitName("Apple") private String appleName; @FruitColor(fruitColor=Color.RED) private String appleColor; @FruitProvider(id=1,name="陕西红富士集团",address="陕西省西安市延安路89号红富士大厦") private String appleProvider; public void setAppleColor(String appleColor) { this.appleColor = appleColor; } public String getAppleColor() { return appleColor; } public void setAppleName(String appleName) { this.appleName = appleName; } public String getAppleName() { return appleName; } public void setAppleProvider(String appleProvider) { this.appleProvider = appleProvider; } public String getAppleProvider() { return appleProvider; } public void displayName(){ System.out.println("水果的名字是:苹果"); } } /***********注解处理器***************/ public class FruitInfoUtil { public static void getFruitInfo(Class<?> clazz){ String strFruitName=" 水果名称:"; String strFruitColor=" 水果颜色:"; String strFruitProvicer="供应商信息:"; Field[] fields = clazz.getDeclaredFields(); for(Field field :fields){ if(field.isAnnotationPresent(FruitName.class)){ FruitName fruitName = (FruitName) field.getAnnotation(FruitName.class); strFruitName=strFruitName+fruitName.value(); System.out.println(strFruitName); } else if(field.isAnnotationPresent(FruitColor.class)){ FruitColor fruitColor= (FruitColor) field.getAnnotation(FruitColor.class); strFruitColor=strFruitColor+fruitColor.fruitColor().toString(); System.out.println(strFruitColor); } else if(field.isAnnotationPresent(FruitProvider.class)){ FruitProvider fruitProvider= (FruitProvider) field.getAnnotation(FruitProvider.class); strFruitProvicer=" 供应商编号:"+fruitProvider.id()+" 供应商名称:"+fruitProvider.name()+" 供应商地址:"+fruitProvider.address(); System.out.println(strFruitProvicer); } } } } /***********输出结果***************/ public class FruitRun { /** * @param args */ public static void main(String[] args) { FruitInfoUtil.getFruitInfo(Apple.class); } } ==================================== 水果名称:Apple 水果颜色:RED 供应商编号:1 供应商名称:陕西红富士集团 供应商地址:陕西省西安市延安路89号红富士大厦
Java注解的基础知识点(见下面导图)基本都过了一遍,下一篇我们通过设计一个基于注解的简单的ORM框架,来综合应用和进一步加深对注解的各个知识点的理解和运用。
相关推荐
JDK11注释处理器复制器运行复制器确保JAVA_HOME环境变量指向Java 11安装。 运行应用程序的构建: mvn clean install编译不会通过以下问题: [INFO] --------------------------------------------------------------...
Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用。包含在 java.lang.annotation 包中。注解...
该插件有助于从Maven使用JDK8提供的集成在Java编译器中的新注释处理 该插件是Maven apt插件的“ alter ego” 文献资料 相关插件 插入 信息 Jboss的eclipse插件 eclipse插件 开发注释处理器 发行版 日期 版本 信息 ...
主要介绍了Java注解处理器简单实例,具有一定借鉴价值,需要的朋友可以参考下
Annotation处理器在处理Annotation时可以根据源文件中的Annotation生成额外的源文件和其它的文件(文件具体内容由Annotation处理器的编写者决定),APT还会编译生成的源文件和原来的源文件,将它们一起生成class文件。...
AnnotationProcessorBased JavaPoet , a demo of annotation processor;有 仿照 Butterknife,简单实现了BindView,OnClick注解过程;
这个项目提供了一个注解处理器来为java内部的方法提供默认参数 免责声明 private methods are not supported! 如何使用 由于项目当前未发布到主要 Maven 存储库,请添加: repositories { maven { url " ...
jpa注解处理器 JPA Annotation Processor 基于“Better JPA、Better JAXB 和 Better Annotations Processing with Java SE 6” ================================================== ============================ ...
开始讲解之前,先说一下AbstractProcessor(注解处理器)和Annotation(注解)。 注解提供了一种为程序元素(类、方法、成员变量等)设置元数据(描述其它数据的数据)的方式。 元注解: 简单的说就是,用来修饰自定义的...
注解在Android中的应用,构建运行时注解处理器和编译时注解处理器,通过Javapoet动态生成代码
无安普Java Annotations 和 Annotation Processer 用于确保覆盖方法。 ##注释|注释|概述| |---|---|---| |@克隆| 如果这个注解被添加到一个类中,clone 方法应该在类和子类中被覆盖。| |@必须覆盖| 如果将此注释添加...
注解处理器模块的开发请参考该模块下的 前端工程模块的开发请参考该模块下的 调度模块的开发请参考该模块下的 管理系统的开发请参考该模块下的 变更日志 todo 贡献者 鸣谢 感谢 为本项目提供了 All Products Pack ...
创建一些伪类的示例注释处理器。 /annotations -- just annotation class for processor to use /application -- annotated classes used for generation /processor -- annotation processor executed by compile ...
4.Java中的注解处理器(Annotation Processing) 5.Java中的Lambda表达式和函数式接口 6.Java中的Optional类和null安全编程 7.Java中的并发集合(ConcurrentHashMap、CopyOnWriteArrayList等) 8.Java中的Future和...
A:大约3kb,运行时没有,只有两个类:@Warning注解和注解处理器。 用法: // some code... @Warning ( " Add caching " ) public void getData() { // bad stuff going on here... } ###下载 Gra
java代码自动生成源码AutoInterface-Java注释处理器 根据带注释的类文件的公共方法生成Java接口。 为类或接口生成Decorator接口 好处 只有一个实现时,无需手动维护接口 帮助诸如Spring之类的框架进行依赖注入 ...
每一个注解处理器都必须继承自AbstractProcessor public class TestProcessor extends AbstractProcessor { @Override public synchronized void init(ProcessingEnvironment processingEnvironment) { super.init...
然后你可以写一个注解处理器去解析处理这些注解(人称编译时注解),也可以在程序运行时利用反射得到注解做出相应的处理(人称运行时注解)。 开发Android程序时,没完没了的findViewById, setOnClickListener等等方法...
Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...
注解_范例安装gradle 我们需要它来更方便地使用依赖项我们有2个模块注解处理器和注解用法。 在intellijIdea中打开注释处理器我们教导intellijIdea生成具有必要附加文件的jar文件。 为什么我们需要这里写的其他文件 ...