Java-注解

 ----------------------java学习型技术博客、期待与您交流!! ----------------------

1. Annotation:注解
是JDK5.0以上版本提供的可以添加到代码之上的修饰符,用来对该代码进行解释和说明。
   1) 可以放置在类的任何组成部分,如:包声明、类(或接口)声明、构造方法、普通方法、成员变量、参数和局部变量。
   2) 注解的使用不会影响代码的功能。
  
2. Java SE API中提供了三个内置注解类型:定义在java.lang包中。注解类型使用时要用@符来引用。
   1) Override:表示一个方法声明打算重写超类中的另一个方法声明。只能用在方法上。它只会保存在源文件中,编译成字节码时会被

丢弃。
   2) Deprecated:它修饰元素时表示不鼓励程序员使用这样的元素。它可以添加到类的任何位置。它会编译到字节码中,并且JVM可以获

取它的信息
   3) SupressWarnings:用来阻止编译器警告。它可用在除包以外的任何位置。它带有一个属性叫value,指定要阻止的警告集。

 

3. 自定义注解。注解的定义类似于接口。
   1) @interface来定义注解类型。
      public @interface MyAnno{}
   2) 通过定义一个同名方法可以在注解类型中添加一个属性,返回值类型就是这个属性的类型。
      public @interface MyAnno{
          String name();
          String[] value();
      }
   3) 默认创建的注解类型可以使用类的任何位置。
  
4. 注解的注解,也叫无注解。它用来指定自定义的注解类型可对放置的位置,保留多久,是否可文档化。内置的元注解定义在

java.lang.annotation包中:
  1) Target:指示注释类型所适用的程序元素的种类。它的属性value要指定为ElementType的枚举值之一:
        TYPE, //适用于 类,接口,枚举
        FIELD, //适用于 成员字段
        METHOD, //适用于 方法
        PARAMETER, //适用于 方法的参数
        CONSTRUCTOR, //适用于 构造方法
        LOCAL_VARIABLE, //适用于 局部变量
        ANNOTATION_TYPE, //适用于 注解类型
        PACKAGE          //适用于 包
  2) Retention:用来告诉编译器如何处理当前注解。它的属性value要指定为RetentionPolicy的枚举值之一:
        SOURCE, //编译器处理完后,并不将它保留到编译后的类文件中
        CLASS, //编译器将注解保留在编译后的类文件中,但是在运行时忽略它
        RUNTIME //编译器将注解保留在编译后的类文件中,并在第一次加载类时读取它。
                   如果需要通过反射来获取某个注解类型信息时,此注解类型在定义必须指定Retention为RetentionPolicy.RUNTIME


  3) Document:可以使被修饰的注解在使用到类元素时,会加入到Javadoc中。
     a) 定义为Documented的注解必须要设置Retention的值为RetentionPolicy.RUNTIME。
 
 
   
5. 通过反射机制来获取注解类型信息
  1) JDK5.0中的java.lang.reflect.AnnotatedElement接口中定义了4个反射性地读取注解信息的方法:
    public Annotation getAnnotation(Class annotationType); 如果存在该元素的指定类型的注解,则返回这些注解,否则返回

null
    public Annotation[] getAnnotations();返回此元素上存在的所有注解
    public Annotation[] getDeclaredAnnotations(); 返回直接存在于此元素上的所有注解
    public boolean isAnnotationPresent(Class annotationType); 如果指定类型的注解存在于此元素上,则返回 true,否则返回

false
  2) java.lang.Class类和java.lang.reflect包中的Constructor, Field, Method, Package类都实现了
    AnnotationElement接口,可以从这些类的实例上分别取得标注于其上的注解及相关信息。

  3) 示例:
   

下面我们给出一个注解的使用例子

package  Annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;


@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.METHOD)
public @interface AShow {//声明一个注解
 boolean value();//注解的成员可以是多个
}

以上就是一个自定义的注解类

我们再来定义一个使用这个注解的类

package  Annotation;

public class Student {
 @AShow(value=false)
 public void show1(){
  System.out.println("aaaa");
 }
 @AShow(value=true)
 public void show2(int i){
  System.out.println("bbbb");
 }
}

这是一个学生类,只有show1和show2两个方法,都应用了注解

那么由于前面注解类定义时我们使用了这样的声明

@Retention(RetentionPolicy.RUNTIME)

所以这个注解我们可以通过反射机制访问到

下面我们来试一下这个测试类

package  Annotation;

import java.lang.reflect.Method;


public class StuAshowTest {
 public static void main(String[] args) {
  Student student=new Student();
  Class stu=student.getClass();
  Method [] methods=stu.getMethods();
  for(Method method:methods){
   AShow a=method.getAnnotation(AShow.class);
   if(a!=null){
    System.out.print(method.getName()+"的注解值为:");
    System.out.println(a.value());
    if(a.value()){
     System.out.println("输出前需要打开连接");
    }else{
     System.out.println("输出前需要记录文件");
    }
   }
  }
 }
}

结果

 

show1的注解值为:false
输出前需要记录文件
show2的注解值为:true
输出前需要打开连接

输出前需要记录文件


 ---------------------- android培训java培训、期待与您交流! ----------------------


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值