一.注解术语
http://zy19982004.iteye.com/blog/1979039里把注解里的术语罗列了一遍,未做深入解读。本文用一个例子来强化注解术语。
二.代码
package com.jyz.study.jdk.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 1.演示四种元注解的用法 * @Target * @Retention * @Document * @Inherited * * @author JoyoungZhang@gmail.com * */ @JyzTargetType @JyzRetentionRuntime @JyzDocument @JyzInherited public class MetaAnnotation { @JyzTargetField private String info; @JyzTargetConstructor public MetaAnnotation(@JyzTargetParamter String info) { this.info = info; } @JyzTargetMethod public void test(){ @JyzTargetLocalVariable String infoInner = "sa"; } } @Target(ElementType.TYPE) @interface JyzTargetType{} //接口、类、枚举、注解 @Target(ElementType.FIELD) @interface JyzTargetField{} //字段、枚举的常量 @Target(ElementType.METHOD) @interface JyzTargetMethod{} //方法 @Target(ElementType.PARAMETER) @interface JyzTargetParamter{} //方法参数 @Target(ElementType.CONSTRUCTOR) @interface JyzTargetConstructor{} //构造函数 @Target(ElementType.LOCAL_VARIABLE) @interface JyzTargetLocalVariable{} //局部变量 @Target(ElementType.ANNOTATION_TYPE) @interface JyzTargetAnnotationType{} //注解 @Target(ElementType.PACKAGE) @Retention(RetentionPolicy.RUNTIME) @interface JyzTargetPackage{public String version() default "";} //包 @JyzTargetAnnotationType @interface JyzTargetAll{} @Retention(RetentionPolicy.SOURCE) @interface JyzRetentionSource{} @Retention(RetentionPolicy.CLASS) @interface JyzRetentionClass{} @Retention(RetentionPolicy.RUNTIME) @interface JyzRetentionRuntime{} @Documented @interface JyzDocument{} @Inherited @interface JyzInherited{}
三.代码解释
- Java内置了四种元注解。或许你要问了,这四种元注解又是哪里来的呢?我们来看看这三种元注解,得到的答案是每一种元注解又是建立在四个元注解的基础之上的。有点自己定义自己的意思。
package java.lang.annotation; @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Target { ElementType[] value(); } @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Retention { RetentionPolicy value(); } @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Documented { } @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Inherited { }
- 什么时候使用这四个元注解?仅仅在你需要定义自己的注解类时,如代码里的Jyz*这些类都是自定义的注解类。
- 什么时候使用自定义注解类或Java内置的几个标准注解类?当然是在普通Java类(指的是不是注解类的类如MetaAnnotation,有时候我也叫它被注解类)里使用。需要记住的是,普通Java类里并不能直接使用元注解,如果你在MetaAnnotation上面加上@Documented,肯定编译报错。
- @Target的八种参数,前六种很好理解,该用什么地方就用什么地方。PACKAGE包的声明会在下文http://zy19982004.iteye.com/blog/1979308单独讲解。于是就是剩下一个ANNOTATION_TYPE了,这个代表了自定义的注解只能用在注解上,看看四个元注解便知,看看
@JyzTargetAnnotationType @interface JyzTargetAll{}
也是这个意思。在自定义的注解类里@Target未指定任何参数的话,代表八种都包括,在代码合适的地方我都能使用@JyzTargetAll。 - @Inherited的作用也在下文说http://zy19982004.iteye.com/blog/1979520。
- @Documented:如果Java普通类里使用@JyzDocumented,则普通Java类的Javadoc里保留@JyzDocumented。
四.使用总结
- 使用四种元注解定义自己的注解类
- @Target(ElementType.?)就根据需要定义吧,不太同意定义成@JyzTargetAll。
- 除非你能保证你的注解类永远被使用在不需要反射的类上,但这个似乎不太可能,所以你最好@Retention(RetentionPolicy.RUNTIME)。
- 至于@Documented也加上吧,对jvm来说完全没什么负担。
- 也建议加上@Inherited,尽管你觉得现在是不需要的,指不定两个被注解类就存在继承关系。
- 为注解类定义需要的属性(上面的Jyz*这些注解类主要是为了演示元注解的使用,并未加上任何元素),并设置默认值。
- 普通Java类里合适的地方使用合适的注解类,并为需要赋值的元素赋值,不赋值将使用默认值。为元素赋值的方式为名-值对,如@JyzTargetPackage(version="1.0") 。如果恰好只需要为一个元素赋值,而这个元素定义为value(),无需使用名值对,只需在括号内给出value元素所需的值即可,如@JyzTargetPackage("1.0") 。
相关推荐
首先,我们需要理解Java注解的基本原理。注解是一种元数据,它提供了一种安全的方法来将信息附加到代码中,而不直接影响代码的执行。Java提供了内置的注解,如`@Override`、`@Deprecated`等,但自定义注解允许我们...
java 元注解+拦截器实现自定义注解 @CmwAutoWired:自定义依赖注入 注意:注入的接口和实现类需要在同一包名下,注解的是类则无限制 @FieldAnnotation:自定义属性注解 @MethodAnnotation:自定义方法注解 @...
### 二、自定义注解 1. **创建**: 自定义注解通过定义一个接口实现,接口的名字即为注解的名字。例如: ```java @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface ...
假设我们有一个User DAO,我们可以定义一个方法来获取用户信息,使用自定义注解: ```java public interface UserRepository { @Query("SELECT * FROM users WHERE id = #{id}") User getUserById(int id); }...
自定义注解是扩展Java功能的强大工具,可以用于实现各种目的,如代码生成、编译时检查、运行时处理等。在这个“自定义注解实现伪动态传参的小demo”中,我们将探讨如何创建一个自定义注解,以允许在注解中传递类似于...
Java自定义注解是Java语言中的一个重要特性,它允许我们创建自己的元数据,为代码提供额外的信息。在Java中,注解(Annotation)主要用于编译器检查、代码生成、运行时处理等方面。本文将深入探讨如何通过反射机制来...
本教程将通过一个超市自动售卖机的例子来详细讲解如何在Java中实现自定义注解。 首先,我们需要了解注解的基本结构。在Java中,注解以`@`符号开头,后面跟着注解的名称。自定义注解的定义类似于接口,但使用`@...
本验证工具的核心思想是通过定义一系列自定义注解来标识需要验证的字段或方法,并通过反射技术动态获取这些注解信息来进行验证。这样做的好处是可以将验证逻辑与业务逻辑分离,使得验证规则更加清晰明了,同时也方便...
- 使用自定义注解: ```java @LogExecutionTime public void doSomething() { // 方法体 } ``` #### 五、总结 Spring框架通过集成Java注解技术极大地简化了配置文件的编写,提高了开发效率。了解并熟练掌握...
"java自定义注解实践" Java 自定义注解实践是 Java 语言中的一项重要特性,它可以使开发者自定义注解,以满足不同的需求。在本文中,我们将详细介绍 Java 自定义注解的概念、特点、实现方式及实践应用。 概念 ----...
然后在需要的地方使用这个自定义注解: ```java public class MyClass { @MyAnnotation(value = "Hello", number = 123) public void myMethod() { // ... } } ``` **处理注解** 处理注解通常有两种方式:...
自定义注解:http://blog.csdn.net/zen99t/article/details/49508447 解析注解:http://blog.csdn.net/zen99t/article/details/49512411 注解反射生成SQL语句:...
接下来,我们可以在类、方法、变量等位置使用这个自定义注解: ```java @MyAnnotation(value = "这是个示例") public class MyClass { // ... } ``` 在上述代码中,我们给`MyClass`类添加了`MyAnnotation`注解,...
java自定义注解接口限流demo; java自定义注解接口限流demo; java自定义注解接口限流demo; java自定义注解接口限流demo; java自定义注解接口限流demo; java自定义注解接口限流demo; java自定义注解接口限流demo...
在Java编程中,自定义注解(Annotation)是一种强大的元数据机制,允许程序员在源代码中插入信息,这些信息可以被编译器、IDE或运行时环境用来进行各种处理。自定义注解使得代码更加可读,易于维护,并且可以自动化...
### 二、自定义注解的语法 自定义注解需要使用`@interface`关键字来定义。注解可以有成员,成员可以有默认值,其成员类型限于原始类型、String、Class、Annotation和Enumeration。如果注解只有一个成员,且命名为`...
2. 使用注解:在需要监控的方法上使用自定义注解,指定相关指标。 ```java @Service public class MyService { @MyMonitor(metricName = "myServiceCall", importance = 5) public void performTask() { // 方法...
接下来,我们可以在代码中使用这个自定义注解: ```java public class MyClass { @MyAnnotation(value = "Hello, Annotation!") public void myMethod() { // ... } } ``` 然后,我们可以利用反射来获取并处理...
这篇学习范例主要涵盖了如何在Java中定义、使用和处理自定义注解。 首先,我们来看自定义注解的定义。在Java中,注解以`@`符号开头,后面跟着注解的名称。自定义注解的定义类似于接口,但使用`@interface`关键字。...
在Java编程语言中,注解(Annotation)是一种元数据,它提供了向编译器或JVM提供附加信息的方式。这些信息可以用于代码分析、编译时检查或运行时处理。...因此,学习和掌握Java注解对于提升开发效率至关重要。