1.注解也被称为元数据,它把元数据与源代码文件结合在一起,而不是保存在外部文档中。它可以用来完整地描述程序所需要的信息,而这个信息是无法用java来表达的。
2.定义注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {}
上面就是注解的定义,很像接口,注解也会编译成class文件。
在定义注解时,需要一些源注解@Target表示定义的注解用于什么地方(例如是方法还是域),@Retention定义注解在哪一级别可用,在源代码中(SOUIRCE),类文件(CLASS)还是运行时(RUNTIME)。
3.在定义注解时,一般还会定义一些元素。注解的元素看起来就像接口的方法,唯一区别是元素可以指定默认值。没有元素的注解称为标记注解,例如上面的Test。下面是定义了一些元素的注解:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface UseCase {
public int id();
public String description() default "no description";
}
使用方法:
public class PasswordUtils {
@UseCase(id = 47, description =
"Passwords must contain at least one numeric")
public boolean validatePassword(String password) {
return (password.matches("\\w*\\d\\w*"));
}
@UseCase(id = 48)
public String encryptPassword(String password) {
return new StringBuilder(password).reverse().toString();
}
@UseCase(id = 49, description =
"New passwords can't equal previously used ones")
public boolean checkForNewPassword(
List<String> prevPasswords, String password) {
return !prevPasswords.contains(password);
}
}
注解元素使用时,表现为名-值对,并置于注解后面的括号内。如果元素被定义为value(),那么在使用时就可以直接赋值,不需要名称,例如:
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SQLString {
int value() default 0;
String name() default "";
Constraints constraints() default @Constraints;
}
使用
public class Member {
@SQLString(30) String firstName;
}
3.java提供了3种标准注解,以及四种元注解
元注解专门负责注解其他的注解,如果想应用于多个地方,可以使用逗号隔开声明。如果想应用于所有,可以省略改声明:
@Target表示注解用于什么地方
@Retention表示需要在什么级别保存改注解
@Documented将注解包含在JavaDoc中
@Inherited允许子类继承父类中的注解
3.如果没有用来读取注解的工具,那么注解也不会比注释更有用,下面是一个提起注解的例子:
public class UseCaseTracker {
public static void trackUseCases(List<Integer> useCases, Class<?> cl) {
for (Method m : cl.getDeclaredMethods()) {
UseCase uc = m.getAnnotation(UseCase.class);
if (uc != null) {
System.out.println("Found Use Case:" + uc.id() + " "
+ uc.description());
useCases.remove(new Integer(uc.id()));
}
}
for (int i : useCases) {
System.out.println("Warning: Missing use case-" + i);
}
}
public static void main(String[] args) {
List<Integer> useCases = new ArrayList<Integer>();
Collections.addAll(useCases, 47, 48, 49, 50);
trackUseCases(useCases, PasswordUtils.class);
}
}
4.注解元素允许使用的类型
(1)所有基本类型
(2)String
(3)Class
(4)enum
(5)Annotation
(6)还可以是注解
不能使用其他类型,否则编译器会出错
5.元素要么有默认值,要么在使用时给出确定的值。不能没有值
6.注解不支持继承,不能使用extends来继承一个注解@interface
2.定义注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {}
上面就是注解的定义,很像接口,注解也会编译成class文件。
在定义注解时,需要一些源注解@Target表示定义的注解用于什么地方(例如是方法还是域),@Retention定义注解在哪一级别可用,在源代码中(SOUIRCE),类文件(CLASS)还是运行时(RUNTIME)。
3.在定义注解时,一般还会定义一些元素。注解的元素看起来就像接口的方法,唯一区别是元素可以指定默认值。没有元素的注解称为标记注解,例如上面的Test。下面是定义了一些元素的注解:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface UseCase {
public int id();
public String description() default "no description";
}
使用方法:
public class PasswordUtils {
@UseCase(id = 47, description =
"Passwords must contain at least one numeric")
public boolean validatePassword(String password) {
return (password.matches("\\w*\\d\\w*"));
}
@UseCase(id = 48)
public String encryptPassword(String password) {
return new StringBuilder(password).reverse().toString();
}
@UseCase(id = 49, description =
"New passwords can't equal previously used ones")
public boolean checkForNewPassword(
List<String> prevPasswords, String password) {
return !prevPasswords.contains(password);
}
}
注解元素使用时,表现为名-值对,并置于注解后面的括号内。如果元素被定义为value(),那么在使用时就可以直接赋值,不需要名称,例如:
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SQLString {
int value() default 0;
String name() default "";
Constraints constraints() default @Constraints;
}
使用
public class Member {
@SQLString(30) String firstName;
}
3.java提供了3种标准注解,以及四种元注解
元注解专门负责注解其他的注解,如果想应用于多个地方,可以使用逗号隔开声明。如果想应用于所有,可以省略改声明:
@Target表示注解用于什么地方
@Retention表示需要在什么级别保存改注解
@Documented将注解包含在JavaDoc中
@Inherited允许子类继承父类中的注解
3.如果没有用来读取注解的工具,那么注解也不会比注释更有用,下面是一个提起注解的例子:
public class UseCaseTracker {
public static void trackUseCases(List<Integer> useCases, Class<?> cl) {
for (Method m : cl.getDeclaredMethods()) {
UseCase uc = m.getAnnotation(UseCase.class);
if (uc != null) {
System.out.println("Found Use Case:" + uc.id() + " "
+ uc.description());
useCases.remove(new Integer(uc.id()));
}
}
for (int i : useCases) {
System.out.println("Warning: Missing use case-" + i);
}
}
public static void main(String[] args) {
List<Integer> useCases = new ArrayList<Integer>();
Collections.addAll(useCases, 47, 48, 49, 50);
trackUseCases(useCases, PasswordUtils.class);
}
}
4.注解元素允许使用的类型
(1)所有基本类型
(2)String
(3)Class
(4)enum
(5)Annotation
(6)还可以是注解
不能使用其他类型,否则编译器会出错
5.元素要么有默认值,要么在使用时给出确定的值。不能没有值
6.注解不支持继承,不能使用extends来继承一个注解@interface