Java基础知识梳理--注解
来源:互联网 发布:中国调查数据网 编辑:程序博客网 时间:2024/05/18 18:44
注解
注解的定义:
@Documented@Retention(RetentionPolicy.RUNTIME)@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})public @interface UseCase { public int id(); public String description() default "default value";}
这是一个普通的注解的定义。从上面可以看出,在定义注解的时候,
- 除了使用
@interface
声明,并且指定名称之外,我们还需要使用一些元注解。 - 定义注解类似于接口中的方法的定义;
- 可以通过default为指定的元素指定一个默认值,如果用户没有为其指定值,就使用默认值;
- Java中提供了三种标准注解
@Override
,@Deprecated
,@SuppressWarnnings
,四种元注解@Target
,@Retention
,@Documented
,@Inherited
.
2、元注解
1. @Target
- 用来定义注解该应用于什么地方,是方法还是字段等等。
@Target
注解的定义是:@Documented@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.ANNOTATION_TYPE)public @interface Target { ElementType[] value();}
可以看出这里内部使用的是一个ElementType类型的数组来保存定义的属性的。而在使用的时候它的表现形式是
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
@Target
注解的数组的每个元素的类型是ElementType
。它的取值和具体的含义如下:- TYPE:类、接口或者enum声明
- FIELD:域声明,包括enum实例
- METHOD:方法声明
- PARAMETER:参数声明
- CONSTRUCTOR:构造器声明
- LOCAL_VARIABLE:局部变量声明
- ANNOTATION_TYPE:注解声明
- PACKAGE:包声明
- TYPE_PARAMETER:类型参数声明
- TYPE_USE:Use of a type
2. @Retention
- 用来定义该注解在哪一个级别可用,比如在源代码中、类文件中或者运行时等。
它的定义是
@Documented@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.ANNOTATION_TYPE)public @interface Retention { RetentionPolicy value();}
这里指定value元素的类型是
RetentionPolicy
,而它的取值是:SOURCE:注解将被编译器丢弃CLASS:注解在class文件中使用,但会被JVM丢弃RUNTIME:VM将在运行期保留注解,故可以通过反射读取注解的信息
3. @Documented
- 将此注解包含在javadoc中
4. @Inherited
- 允许子类继承父类的注解
3、注解的处理
以下通过一个小程序来演示注解的基本使用方法:
这里我们为程序定义了两个注解,@Column
注解应用于字段,@Important
注解应用于方法:
@Target(value = {ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)public @interface Column { String name();}@Target(value = {ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)public @interface Important {}
然后我们定义了一个Person类,并使用注解为其中的部分方法和字段添加注解:
private static class Person { @Column(name = "age") private int age; @Column(name = "first_name") private String firstName; @Column(name = "last_name") private String lastName; private int temp; public int getAge() { return age; } @Important public void setAge(int age) { this.age = age; } public String getFirstName() { return firstName; } @Important public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } @Important public void setLastName(String lastName) { this.lastName = lastName; }}
然后,我们使用Person类来获取该类的字段和方法的信息,并输出具有注解的部分:
public static void main(String ...args) { Class<?> c = Person.class; Method[] methods = c.getDeclaredMethods(); for (Method method : methods) { if (method.getAnnotation(Important.class) != null) { System.out.println(method.getName()); } } Field[] fields = c.getDeclaredFields(); for (Field field : fields) { if (field.getAnnotation(Column.class) != null) { System.out.println(field.getName()); } }}
输出结果:
setAgesetFirstNamesetLastNameagefirstNamelastName
更多内容
1、该项目整理了设计模式、Java语法、JVM、SQL、数据结构与算法等相关内容:https://github.com/Shouheng88/Java-Programming。
2、由于时间仓促,不免于存在错误,欢迎批评指正。
阅读全文
0 0
- Java基础知识梳理--注解
- 系统梳理Java注解
- Java注解梳理
- Java基础知识梳理
- java基础知识梳理
- Java基础知识梳理
- Java基础知识梳理--线程
- Java基础知识梳理--IO
- Java基础知识梳理--泛型
- JAVA基础知识梳理(一)
- JAVA基础知识梳理(二)
- JAVA基础知识梳理(三)
- JAVA基础知识梳理(四)
- java day03-day05 基础知识梳理
- Java基础知识_注解
- 基础知识梳理
- Java知识点整理:第一章:基础知识梳理
- Java基础知识之注解Annotation
- pl011_init
- 51nod 1397
- MySQL 使用自增ID主键和UUID 作为主键的优劣比较详细过程(从百万到千万表记录测试)
- 常见的HTTP状态码详解
- Linux几个命令
- Java基础知识梳理--注解
- 第二章 SQL命令参考- VACUUM
- jsp的内置对象及方法简单解析
- VirtualBox导出OVF导致原来的虚拟机连不上网问题
- InnoDB关键特性,innodb_old_blocks_time,锁,内存管理,latch争用
- SQLServer性能调优之缓存
- 模拟弱网环境
- 继承原则与子父类初始化过程,类成员访问权限,普通类与抽象类,throwble类,重写与重载,string对象修改,i=i++;
- Java容器框架知识梳理