要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解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中文网其他相关文章!

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

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

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

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

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


热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

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

SublimeText3 Linux新版
SublimeText3 Linux最新版

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

Atom编辑器mac版下载
最流行的的开源编辑器

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