刚学了 Java 自定义注解,写篇文章来记录一下,加深一下印象
首先来看一个简单的自定义注解类 MyAnno.java
package com.test.x;
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;
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface MyAnno {
String name();
int age() default 10;
}
@interface
用来表示这是一个注解
首先来看这个注解的上半部分,上面的四个注解称为 元注解
-
@Target({ElementType.METHOD,ElementType.TYPE})
表示该注解的作用域,这里表示作用于 方法,类或接口 上 -
@Retention(RetentionPolicy.RUNTIME)
表示该注解的生命周期,一般都是RUNTIME
-
@Inherited
表示该注解可被继承(当一个子类继承一个有注解的父类时,子类会继承该父类的注解) -
@Documented
表示生成的javadoc
中包含该注解
再看注解类里面的内容
name
,age
都是这个注解类的成员,注解类的成员必须是 无参且不抛异常的 ,但可以有 默认值
当注解类只有一个成员时,成员名必须为 value
接下来看看自定义注解的使用
这是一个简单的 Java 类,在该类中使用了自定义的注解
package com.test.x;
@MyAnno(name="Tom")
public class User {
@MyAnno(name="Tom Smith",age=12)
public void info() {
}
}
接下来要获取注解的值,包括类上的和方法上的
package com.test.x;
import java.lang.reflect.Method;
import com.test.Description;
public class Main {
public static void main(String[] args) {
//
User user = new User();
//得到Class
Class c = user.getClass();
//判断类上有没有使用该注解
boolean exists = c.isAnnotationPresent(MyAnno.class);
if(exists) {
//获取类上面的注解
MyAnno anno = (MyAnno)c.getAnnotation(MyAnno.class);
System.out.println(anno.age());
System.out.println(anno.name());
}
//获取方法上面的注解
Method[] ms = c.getMethods();
for(Method m : ms) {
boolean mExist = m.isAnnotationPresent(MyAnno.class);
if(mExist) {
MyAnno manno = (MyAnno)m.getAnnotation(MyAnno.class);
System.out.println(manno.name());
System.out.println(manno.age());
}
}
}
}
这就是一个简单的自定义注解示例了。
网友评论