搜索
首页Javajava教程Java自定义注解

Java自定义注解

Jun 23, 2017 pm 04:38 PM
java注解自定义

 


 

要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解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();
    }

}

 

以上是Java自定义注解的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
如何将Maven或Gradle用于高级Java项目管理,构建自动化和依赖性解决方案?如何将Maven或Gradle用于高级Java项目管理,构建自动化和依赖性解决方案?Mar 17, 2025 pm 05:46 PM

本文讨论了使用Maven和Gradle进行Java项目管理,构建自动化和依赖性解决方案,以比较其方法和优化策略。

如何使用适当的版本控制和依赖项管理创建和使用自定义Java库(JAR文件)?如何使用适当的版本控制和依赖项管理创建和使用自定义Java库(JAR文件)?Mar 17, 2025 pm 05:45 PM

本文使用Maven和Gradle之类的工具讨论了具有适当的版本控制和依赖关系管理的自定义Java库(JAR文件)的创建和使用。

如何使用咖啡因或Guava Cache等库在Java应用程序中实现多层缓存?如何使用咖啡因或Guava Cache等库在Java应用程序中实现多层缓存?Mar 17, 2025 pm 05:44 PM

本文讨论了使用咖啡因和Guava缓存在Java中实施多层缓存以提高应用程序性能。它涵盖设置,集成和绩效优势,以及配置和驱逐政策管理最佳PRA

如何将JPA(Java持久性API)用于具有高级功能(例如缓存和懒惰加载)的对象相关映射?如何将JPA(Java持久性API)用于具有高级功能(例如缓存和懒惰加载)的对象相关映射?Mar 17, 2025 pm 05:43 PM

本文讨论了使用JPA进行对象相关映射,并具有高级功能,例如缓存和懒惰加载。它涵盖了设置,实体映射和优化性能的最佳实践,同时突出潜在的陷阱。[159个字符]

Java的类负载机制如何起作用,包括不同的类载荷及其委托模型?Java的类负载机制如何起作用,包括不同的类载荷及其委托模型?Mar 17, 2025 pm 05:35 PM

Java的类上载涉及使用带有引导,扩展程序和应用程序类负载器的分层系统加载,链接和初始化类。父代授权模型确保首先加载核心类别,从而影响自定义类LOA

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
4 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。