Java注解
来源:互联网 发布:ipad软件的目录 编辑:程序博客网 时间:2024/06/05 06:01
Java注解是插入代码中的一种注释或者说一种元数据(mete data)。这些注解信息可以在编译期使用编译期使用预编译工具进行处理,也可以运用Java的反射机制在运行时处理。注解为我们在代码中添加信息提供了一种形式化的方法。
Java中的注解主要是:
- 元注解
- 自定义注解
元注解
Java提供了四个基本的元注解类型:
这些类型在:java.lang.annotation包中
@Documented
@Documented是指示某一类型的注解将通过java doc和默认的工具进行文档化。如果类型声明是用 Documented 来注释的,则其注释将成为注释元素的公共 API 的一部分。
@Inherited
指示注释类型被自动继承,如果在注释类型中存在@Inherited元注释,并且用户在某一类声明中查询该注释类型,同时该类声明中没有此类型的注释,则将在该类的超类中自动查询该注释类型。此过程会重复进行,直到找到此类型的注释或到达了该类层次结构的顶层 (Object) 为止。如果没有超类具有该类型的注释,则查询将指示当前类没有这样的注释。
@Retention
指示注释类型的注释要保留多久,如果注释类型声明中不存在 Retention 注释,则保留策略默认为 RetentionPolicy.CLASS。
- CLASS: 在class文件中有效,即class保留。
- RUNTIME: 在运行时有效,即运行时保留。(这样注解处理器可以通过反射,获取到该注解的属性值)
- SOURCE: 在源文件中有效,即源文件中保留。
@Target
指示注释类型所适用的程序元素的种类。如果注释类型声明中不存在 Target 元注释,则声明的类型可以用在任一程序元素上。如果存在这样的元注释,则编译器强制实施指定的使用限制。
@Target可被用于
自定义注解
@interface用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum)。可以通过default来声明参数的默认值。
定义注解格式:
public @interface 注解名称 {
……
}
创建自定义注解,类似创建接口。
import java.lang.annotation.*;@Documented@Inherited@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@interface AuthorAnno{ String name(); char sex() default 'F';}
自定义注解的规则:
- 注解方法不带参数。
- 注解方法的返回值类型:基本类型、String、Enums、Annotation以及前面这些类型的数组类型
- 注解方法可有默认值:char sex() default ‘F’;
注解解析
通过反射技术来解析自定义注解,使用java.lang.reflect 的接口:AnnotatedElement。该接口允许反射性地读取注释。
在代码中使用自定义注解@AuthorAnno。
@Documented@Inherited@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@interface AuthorAnno{ String name(); char sex() default 'M';}public class AuthorAnnoDemo { @AuthorAnno(name="YEN",sex = 'M') public static void main(String[] args) { System.out.println("...........main............."); } @AuthorAnno(name="yen",sex = 'M') public void demo(){ System.out.println("..... .....demo............."); }}
那么可以利用上面的反射方法,来实现解析@AuthorAnno的功能
public class AnnotationParser { public static void main(String[] args) throws ClassNotFoundException { String myclass="AuthorAnnoDemo"; Method[] methods=AnnotationParser.class.getClassLoader().loadClass(myclass).getMethods(); for(Method method:methods){ if(method.isAnnotationPresent(AuthorAnno.class)){ AuthorAnno authorAnno=method.getAnnotation(AuthorAnno.class); System.out.println("method................."+method); System.out.println("name.........."+authorAnno.name()+"..........sex........."+authorAnno.sex()); } } }}
Java的注解要结合反射机制来使用。
- Java注解-自定义注解
- Java注解----自定义注解
- Java注解自定义注解
- Java注解--四种元注解
- Java注解-三种內建注解
- 【Java】【注解】自定义注解
- java注解
- java注解
- java注解
- java 注解
- Java注解
- java 注解
- Java 注解
- Java注解
- java 注解
- JAVA注解
- Java注解
- Java注解
- 神经网络和深度学习简史(三):强化学习与递归神经网络
- 基于深度学习的目标检测研究进展
- math-多项式的竖式整除
- 1600: BCD时钟
- Go起步:6、复合类型3--字典(map)及其他
- Java注解
- 关于java socket多用户聊天--图形界面版&带高层架构思想(经典面试题)
- 1601: 名字缩写
- class prototype 共享内存
- Android_数据库操作_笔记
- 利用mybatis-generator自动生成代码
- 华为信息机与c3po包的冲突
- 1602: 再次签到 //注 本题有错!但是就这么AC了! 应该是DP不是贪心!
- Palindrome Partitioning II