0

0

Java自定义注解

巴扎黑

巴扎黑

发布时间:2017-06-23 16:38:15

|

1876人浏览过

|

来源于php中文网

原创

 


 

要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法。

 1 package annotation; 2  3 import static java.lang.annotation.ElementType.METHOD; 4 import static java.lang.annotation.RetentionPolicy.RUNTIME; 5  6 import java.lang.annotation.Documented; 7 import java.lang.annotation.ElementType; 8 import java.lang.annotation.Retention; 9 import java.lang.annotation.RetentionPolicy;10 import java.lang.annotation.Target;11 /**12  * 
13  * @author Minzhe Xu    2017年4月27日下午3:22:5214  * 
15  *@Target 表示该注解用于什么地方,可能的值在枚举类 ElemenetType 中,包括:  
16  *ElemenetType.CONSTRUCTOR:构造器声明 
17  *ElemenetType.FIELD :域声明(包括 enum 实例) 
18  *ElemenetType.LOCAL_VARIABLE:局部变量声明 
19  *ElemenetType.METHOD :方法声明 
20  *ElemenetType.PACKAGE :包声明 
21  *ElemenetType.PARAMETER :参数声明 
22  *ElemenetType.TYPE:类,接口(包括注解类型)或enum声明 
23  *24  *@Retention 表示在什么级别保存该注解信息。可选的参数值在枚举类型 RetentionPolicy 中,包括: 
25  *RetentionPolicy.SOURCE :注解将被编译器丢弃 
26  *RetentionPolicy.CLASS :注解在class文件中可用,但会被VM丢弃 
27  *RetentionPolicy.RUNTIME VM:将在运行期也保留注释,因此可以通过反射机制读取注解的信息。 
28  *29  *@Documented 将此注解包含在 javadoc 中 ,它代表着此注解会被javadoc工具提取成文档。在doc文档中的内容会因为此注解的信息内容不同而不同。相当与@see,@param 等。30  *31  *@Inherited 允许子类继承父类中的注解。32  */33 34 @Target({ElementType.TYPE,ElementType.CONSTRUCTOR,ElementType.METHOD,ElementType.PARAMETER,ElementType.FIELD})35 @Retention(RetentionPolicy.RUNTIME)36 public @interface TestA {37 38     /**39      * @interface用来声明一个注解,40      * 其中的每一个方法实际上是声明了一个配置参数。41      * 方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum)。42      * 可以通过default来声明参数的默认值。43      */44     String name();45     int id() default 0;46     Class gid();47 48 }

 测试类

 1 package annotation; 2  3 import java.util.HashMap; 4 import java.util.Map; 5  6 /** 7  * 
 8  * @author Minzhe Xu    2017年4月27日下午3:09:20 9  *10  */11 @TestA(gid = Long.class, name = "type")12 public class UserAnotation {13     @TestA(gid = Long.class, name = "param",id=1)14     private Integer age;15 16     @TestA(gid = Long.class, name = "constract",id=2)17     public UserAnotation(){18 19     }20     @TestA(gid = Long.class, name = "method",id=3)21     public void test1(){22         @SuppressWarnings("rawtypes")23         Map m=new HashMap(0);24     }25 26     @TestA(gid = Long.class, name = "method3",id=5)27     public void test2(@TestA(gid = Long.class, name = "inner_param",id=4) Integer a){28 29     }30 31 32 }

通过反射的方式 使用注解

package annotation;import java.lang.annotation.Annotation;import java.lang.reflect.Constructor;import java.lang.reflect.Method;/**
 * 
 * @author Minzhe Xu    2017年4月27日下午3:39:17
 * */public class ParseAnotation {public static void parseTypeAnnotation() throws ClassNotFoundException{
        Class clazz=Class.forName("annotation.UserAnotation");
        Annotation[] annotations = clazz.getAnnotations();for(Annotation annotation:annotations){
            TestA testA=(TestA) annotation;
            System.out.println("id="+testA.id()+";name="+testA.name()+";gid="+testA.gid());
        }
    }public static void parseMethodAnnotation(){
        Method[] methods = UserAnotation.class.getDeclaredMethods();for(Method method:methods){boolean hasAnnotation=method.isAnnotationPresent(TestA.class);if(hasAnnotation){
                TestA testA=method.getAnnotation(TestA.class);
                System.out.println("id="+testA.id()+";name="+testA.name()+";gid="+testA.gid());
            }
        }
    }

    @SuppressWarnings("unchecked")public static void parseConstractAnnotation(){
        Constructor[] constructors = UserAnotation.class.getConstructors();for(Constructor contructor:constructors){boolean annotationPresent = contructor.isAnnotationPresent(TestA.class);//isAnnotationPresent方法来判断是否使用了某个注解if(annotationPresent){
                TestA testA = (TestA) contructor.getAnnotation(TestA.class);
                System.out.println("id="+testA.id()+";name="+testA.name()+";gid="+testA.gid());
            }
        }
    }public static void main(String[] args) throws ClassNotFoundException {
        parseTypeAnnotation();
        parseMethodAnnotation();
        parseConstractAnnotation();
    }

}

论小文
论小文

可靠的论文写作助手,包含11种学术写作类型,万字论文一键生成,可降重降AIGC,参考文献真实可标注,图表代码均可自定义添加。

下载

 

相关文章

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

150

2025.12.31

php网站源码教程大全
php网站源码教程大全

本专题整合了php网站源码相关教程,阅读专题下面的文章了解更多详细内容。

88

2025.12.31

视频文件格式
视频文件格式

本专题整合了视频文件格式相关内容,阅读专题下面的文章了解更多详细内容。

90

2025.12.31

不受国内限制的浏览器大全
不受国内限制的浏览器大全

想找真正自由、无限制的上网体验?本合集精选2025年最开放、隐私强、访问无阻的浏览器App,涵盖Tor、Brave、Via、X浏览器、Mullvad等高自由度工具。支持自定义搜索引擎、广告拦截、隐身模式及全球网站无障碍访问,部分更具备防追踪、去谷歌化、双内核切换等高级功能。无论日常浏览、隐私保护还是突破地域限制,总有一款适合你!

61

2025.12.31

出现404解决方法大全
出现404解决方法大全

本专题整合了404错误解决方法大全,阅读专题下面的文章了解更多详细内容。

493

2025.12.31

html5怎么播放视频
html5怎么播放视频

想让网页流畅播放视频?本合集详解HTML5视频播放核心方法!涵盖<video>标签基础用法、多格式兼容(MP4/WebM/OGV)、自定义播放控件、响应式适配及常见浏览器兼容问题解决方案。无需插件,纯前端实现高清视频嵌入,助你快速打造现代化网页视频体验。

16

2025.12.31

关闭win10系统自动更新教程大全
关闭win10系统自动更新教程大全

本专题整合了关闭win10系统自动更新教程大全,阅读专题下面的文章了解更多详细内容。

12

2025.12.31

阻止电脑自动安装软件教程
阻止电脑自动安装软件教程

本专题整合了阻止电脑自动安装软件教程,阅读专题下面的文章了解更多详细教程。

5

2025.12.31

html5怎么使用
html5怎么使用

想快速上手HTML5开发?本合集为你整理最实用的HTML5使用指南!涵盖HTML5基础语法、主流框架(如Bootstrap、Vue、React)集成方法,以及无需安装、直接在线编辑运行的平台推荐(如CodePen、JSFiddle)。无论你是新手还是进阶开发者,都能轻松掌握HTML5网页制作、响应式布局与交互功能开发,零配置开启高效前端编程之旅!

2

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 2.2万人学习

C# 教程
C# 教程

共94课时 | 5.9万人学习

Java 教程
Java 教程

共578课时 | 41.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号