热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java自定义注解实现方式,javaspringmvc一个功能怎么实现

转载链接:https:www.cnblogs.comUncleWang001p11044902.html什么是注解?对于很多初次接触的开发者来说应该都有这个疑问?Annon


转载: https://www.cn blogs.com/uncle Wang 001/p/11044902.html


评论是什么? 对于很多初次接触的开发者来说,应该有这个疑问吧? Annontation是Java5开始引入的新特征,中文名字叫注释。 它为将任何信息或元数据(元数据)与程序元素(类、方法、成员变量等)相关联提供了一种安全、类似的注释机制。 用更直观、更有意义的描述填充程序元素(类、方法和成员变量)。 这些描述性信息将用于指定的工具或框架,而与程序的业务逻辑无关。 Annontation与修饰符一样,适用于包、类型、生成方法、方法、成员变量、参数和局部变量的声明语句。


Java注释是附加在代码中的元信息,用于完成编译、运行时分析和使用、说明和设置功能的工具。 注释并不影响代码的实际逻辑,它只是辅助作用。 包含在java.lang.annotation包中。


注释的有用性: 1、文档的生成。 这是最常见的,是java首先提供的注释。 常用的有@param @return等


2、跟踪代码相关性,实现备用配置文件功能。 例如,Dagger 2依赖于注入,未来的java开发会配置大量的评论,非常有用;


3、编译时进行格式检查。 如果@override位于方法之前,并且您的方法并不涵盖超类方法,则可以在编译时进行检查。


注释原理:注释的本质是继承Annotation的特殊接口,其具体实现类是由Java运行时生成的动态代理类。 在反射中获取注释时,将返回Java运行时生成的动态代理对象$Proxy1。 通过代理对象调用自定义注释(接口)的方法时,最终将调用AnnotationInvocationHandler的invoke方法。 此方法从名为memberValues的映射中索引相应的值。 memberValues的源是Java常量池。


元注释: java.lang.annotation提供了四种类型的元注释。 特别是对于其他注释,在自定义注释时必须使用元注释。


@ documented是否在JavaDoc中包含注释


@ retention何时使用此注释


@ target在哪里使用注释


@ inherited是否允许子类继承注释


1.) @ retention定义注释的生命周期


RetentionPolicy.SOURCE :在编译阶段被丢弃。 这些注释在编译结束后就没有意义了,所以不会写入字节码。 @Override,@SuppressWarnings都属于这样的评论。


RetentionPolicy.CLASS :在类加载过程中被丢弃。 有助于处理字节码文件。 注释缺省情况下使用此方法


RetentionPolicy.RUNTIME :永远不会丢弃,注释在运行期间也会保留,因此可以使用反射机制读取注释信息。 我们定制的评论通常使用这个方法。


2.) target指示使用此注释的位置。 默认值为任何元素,表示使用注释的位置。 可用的ElementType参数如下


ElementType.CONSTRUCTOR:用于描述构造函数


ElementType.FIELD:成员变量、对象和属性(包括enum实例)


element type.local _ variable :用于描述局部变量


ElementType.METHOD:用于描述方法


ElementType.PACKAGE:用于描述软件包


ElementType.PARAMETER:用于描述参数


ElementType.TYPE:用于描述类、接口(包括注释类型)或enum声明


3.) documented简单的Annotations标记注释,指示是否将注释信息添加到java文档中。


4.) @ inherited定义注释和子类的关系


@Inherited元注释是标记注释,@Inherited表示被标记的类型将被继承。 如果class使用了具有@Inherited限定的annotation类型,则此annotation将用于class的子类。


一般Annotation: 1.)概述


java.lang.Override是用作标记方法的标记类型注释。 表示标记的方法重载了父类的方法,并起到了断言的作用。 如果方法未覆盖父类方法,则使用此注释时,java编译器将警告编译错误。


2.)深度


Deprecated也是标记类型的注释。 如果类型或类型成员使用@Deprecated限定,编译器将不建议使用此已标记的程序元素。 因此,使用这种修饰具有一定的“连续性”。 如果在代码中通过继承或复盖使用此旧类型或成员,则继承或复盖的类型或成员并未声明为@Deprecated,但编译器必须警告。


3.) SuppressWarnings


SuppressWar

ning 不是一个标记类型注解。它有一个类型为String[] 的成员,这个成员的值为被禁止的警告名。对于javac 编译器来讲,被-Xlint 选项有效的警告名也同样对@SuppressWarings 有效,同时编译器忽略掉无法识别的警告名。
  @SuppressWarnings(“unchecked”)

自定义注解:

自定义注解类编写的一些规则:

Annotation 型定义为@interface, 所有的Annotation 会自动继承java.lang.Annotation这一接口,并且不能再去继承别的类或是接口.参数成员只能用public 或默认(default) 这两个访问权修饰参数成员只能用基本类型byte、short、char、int、long、float、double、boolean八种基本数据类型和String、Enum、Class、annotations等数据类型,以及这一些类型的数组.要获取类方法和字段的注解信息,必须通过Java的反射技术来获取 Annotation 对象,因为你除此之外没有别的获取注解对象的方法注解也可以没有定义成员,,不过这样注解就没啥用了
PS:自定义注解需要使用到元注解 自定义注解实例:

FruitName.java

import java.lang.annotation.Documented;import java.lang.annotation.Retention;import java.lang.annotation.Target;import static java.lang.annotation.ElementType.FIELD;import static java.lang.annotation.RetentionPolicy.RUNTIME;/** * 水果名称注解 */@Target(FIELD)@Retention(RUNTIME)@Documentedpublic @interface FruitName { String value() default "";}

FruitColor.java

import java.lang.annotation.Documented;import java.lang.annotation.Retention;import java.lang.annotation.Target;import static java.lang.annotation.ElementType.FIELD;import static java.lang.annotation.RetentionPolicy.RUNTIME;/** * 水果颜色注解 */@Target(FIELD)@Retention(RUNTIME)@Documentedpublic @interface FruitColor { /** * 颜色枚举 */ public enum Color{ BLUE,RED,GREEN}; /** * 颜色属性 */ Color fruitColor() default Color.GREEN;}

FruitProvider.java

import java.lang.annotation.Documented;import java.lang.annotation.Retention;import java.lang.annotation.Target;import static java.lang.annotation.ElementType.FIELD;import static java.lang.annotation.RetentionPolicy.RUNTIME;/** * 水果供应者注解 */@Target(FIELD)@Retention(RUNTIME)@Documentedpublic @interface FruitProvider { /** * 供应商编号 */ public int id() default -1; /** * 供应商名称 */ public String name() default ""; /** * 供应商地址 */ public String address() default "";}

FruitInfoUtil.java

import java.lang.reflect.Field;/** * 注解处理器 */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); } } }}

Apple.java

import test.FruitColor.Color;/** * 注解使用 */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("水果的名字是:苹果"); }}

FruitRun.java

/** * 输出结果 */public class FruitRun { public static void main(String[] args) { FruitInfoUtil.getFruitInfo(Apple.class); }}

运行结果是:
水果名称:Apple
水果颜色:RED
供应商编号:1 供应商名称:陕西红富士集团 供应商地址:陕西省西安市延安路89号红富士大厦

参考链接:
[1]http://www.cnblogs.com/peida/archive/2013/04/26/3038503.html
[2]http://www.cnblogs.com/whoislcj/p/5671622.html
[3]http://blog.csdn.net/lylwo317/article/details/52163304


推荐阅读
author-avatar
居生扬_977
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有