java 注解
一、创建
1、注解创建
public @interface Book { }
2、注解属性
数据类型 名称();
数据类型 名称() defalut value; value是默认值
3、定义的数据类型
a、四类八种
b、String类型,class类型,枚举类型,注解类型
c、以上类的一维数组
package com.wt.anno; public @interface Book { String bookName(); String[] author(); int sale() default 20; }
二、使用(为注解属性赋值)
1、使用位置
类、方法、成员变量、局部变量、参数位置
2、使用格式
@注解名(属性名=值, 属性名=值, 属性名={元素1,元素2}) // 数组
注意:
a、空注解可以直接使用
b、不同位置可以使用同一注解
c、如果注解中有默认值,可以不赋值
d、如果只有一个属性,且属性名加value,那么使用注解的时候,属性名不用写,直接写值
package com.wt.anno; @Book(bookName = "如何勾引富婆", author = {"浪子", "贾宝玉"}) public class BookSelf { }
3、解析
a、判断有没有注解
// 反射类 Class<被注解类> 名称 = 被注解类.class; 名称.isAnnotationPresent(被注解类.class);
b、使用
被注解类 对象名称 = 名称.getAnnotation(被注解类.class); System.out.println(对象.注解属性());
c、案例
package com.wt.anno; import org.junit.Test; public class Test01 { @Test public void useAnno(){ Class<BookSelf> bookSelfClass = BookSelf.class; boolean b = bookSelfClass.isAnnotationPresent(Book.class); System.out.println(b); if (b){ Book book = bookSelfClass.getAnnotation(Book.class); System.out.println(book.bookName()); } } }
4、使用元注解,在注解上使用
a、控制注解使用位置----@Target
属性:ElementType
成员:
TYPE:只能在类上使用
FIELD:属性
METHOD:方法
PARAMETER:参数
CONSTRUCTOR:构造
LOCAL_VARIABLE:局部变量
b、控制生命周期----@Retention
属性:RetentionPolicy
成员:
SOUREC:默认
CLASS:在class文件中出现
RUNTIME:在内存在出现
package com.wt.anno; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface Book { String bookName(); String[] author(); int sale() default 20; }
测试代码
package com.wt.anno; import org.junit.Test; public class Test01 { @Test public void useAnno(){ Class<BookSelf> bookSelfClass = BookSelf.class; boolean b = bookSelfClass.isAnnotationPresent(Book.class); System.out.println(b); if (b){ Book book = bookSelfClass.getAnnotation(Book.class); System.out.println(book.bookName()); } } }