自定义注解,jdk注解,jdk1.8新增注解。

来源:互联网 发布:百度源码 编辑:程序博客网 时间:2024/06/13 21:16

1.自定义注解:
public @interfase Test{
//没有默认值
String name();
//枚举型注解,并赋予默认值
public enum Course{
CHINESE,
MATH
};
Course course() defalut Course.MATH;
}


例如:  @Test(name="张三", course=Test.Course.MATH)
public void helloWord(){} 


2.使用jdk定义注解:
用 @Target 指定ElementType属性
public enum ElementType {
   // 用于类,接口,枚举,但不用于枚举值。
   TYPE,
   // 字段上,包括枚举值
   FIELD,
   // 方法,不包括构造方法
   METHOD,
   // 方法的参数
   PARAMETER,
   // 构造方法
   CONSTRUCTOR,
   // 本地变量或catch语句
   LOCAL_VARIABLE,
   // 用于注解
   ANNOTATION_TYPE,
   // Java包
   PACKAGE
   //泛型,1.8新增
   TYPE_PARAMETER,
   //任意类类型,1.8新增
   TYPE_USE
}
jdk1.8新增注解使用示例:
例1: 注解定义:@Target(ElementType.TYPE_PARAMETER)
public @interface Annotation1 {}
注解使用: public class Test<@Annotation1 T>{}


例2: 注解定义:@Target(ElementType.TYPE_USE)
public @interface Annotation2 {}
注解使用: @Annotation2
public class Test{
@Annotation2 String text;
List<@Annotation1 Object> list = new ArrayList<>();
}


3.注解保持性:
用 @Retention 指定RetentionPolicy 属性


public enum RetentionPolicy {
  // 此类型会被编译器丢弃,不会保存到class文件中
  SOURCE,
  // 此类型注解会保留在class文件中,但JVM会忽略它
  CLASS,
  // 此类型注解会保留在class文件中,JVM会读取它
  RUNTIME
}


4.支持文档化:
@Documented
public @interface Greeting {}
注意:如果用该注解则RetentionPolicy必须设置为RUNTIME。


5.继承:
  让该注解可以被继承,可以作用到子类。
@Inherited
public @interface Greeting {}


6.获取注解的方法:
public class AnnotationReadTest {
   public static void main(String[] args) throws Exception {
// 获取Test类对象
Class c = Class.forName("com.sun.Test");
// 获取该类所有方法
Method[] methods = c.getDeclaredMethods();
// 遍历方法
for (Method method : methods) {
   // 获取方法上面的注解
   Annotation[] annotations = method.getDeclaredAnnotations();
   // 遍历注解
   for (Annotation annotation : annotations) {
System.out.println("方法名为:" + method.getName() + ",方法对应的注解为:" + annotation.annotationType().getSimpleName());
//获取该注解的所有变量
Method[] meths = annotation.annotationType().getDeclaredMethods();
// 遍历每个注解的变量
for (Method m : meths) {
   System.out.println("注解的变量名为:" + m.getName());
}
   }
}
   }
}
另外:
Class.getDeclaredFields()和Class.getFields()的区别:
Class.getDeclaredFields()获取该类所有的字段,与修饰符无关。和Class.getDeclaredMethods方法相同。
Class.getFields()获取该类以及该类所继承的父类所有public修饰符修饰的字段。和Class.getMethods方法相同。

原创粉丝点击