黑马程序员--注解

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

  了解几个基本的注解
       @SuppressWarnings
比如有方法过时了, 那么JAVAC编译时就会出现警告, 如果用了@SuppressWarnings("deprecation") ,则忽略警告

通过System.runFinalizersOnExit(true);的编译警告引出@SuppressWarnings("deprecation") ;
       @Deprecated
提示某方法过时; 直接在原有的类中增加一个方法,并加上@Deprecated标注,在另外一个类中调用这个方法会提示过时 
       @Override
覆盖,也叫重写, 通常只有继承的子类会出现此注解, 意味不调用父类方法,而是调用子类自己重写过的方法..
public boolean equals(Reflect other)方法与HashSet结合讲解
      总结:
      注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事。标记可以加在包,类,字段,方法,方法的参数以及局部变量上。
看java.lang包,可看到JDK中提供的最基本的annotation。 

       生命周期:
·      源文件阶段,当我们写代码的时候带上注解,然后编译成class的时候会进行判断,有可能注解不被保留到class文件里。
        class阶段,编译成.class的时候,注解依旧保留,但是到加载到内存的时候,有可能不被保留。
        Runtime阶段,加载到内存后,一直到注解被使用为止。
注解那么强大, 就因为注解有属性所以才强大,一个注解相当于一个实例化好的类 
 
@Retention(RetentionPolicy.RUNTIME) // 意思是说保留注解时间到运行期间 它是一个元注解, 就是说 注解类里的注解.


@Target({ElementType.METHOD,ElementType.TYPE}) 


//Target 限定注解放置的位子, 比如说限定放在方法上, 默认是哪里都能放置

  // 注解里接收的是一个Eume对象, 是一个枚举..方便调用他定义好的值


public @interface ItcastAnnotation {        //注解跟接口不太一样, 前面加了@符号



 String color() default "blue";  //注解里有个方法叫做color, 它是抽象的, 也是public的,可以不写出来,默认值是 blue

 


String value();



 int[] arrayAttr() default {3,4,4}; // 同上面方法的解释



 EnumTest.TrafficLamp lamp() default EnumTest.TrafficLamp.RED; //内部类的注解形式



 MetaAnnotation annotationAttr() default @MetaAnnotation("lhm"); //注解类里嵌套注解MetaAnnotation 也是一个注解,

   // 注解的话, 必须用@, @代表一个实例,这个实例里有一个方法value();

}


 

 


//注解里有多值就必须写多少值,顺序随便

@ItcastAnnotation(annotationAttr=@MetaAnnotation("flx"),color="red",value="abc",arrayAttr=1) 



public class AnnotationTest {


 /**

  * @param args

  */

 @SuppressWarnings("deprecation") //由下面的解释可以知道, SuppressWarnings类里有一个方法, 

                                                          
  //具体名称不明, 但是效果是告知取消警告


 @ItcastAnnotation("xyz") 


//只有一个方法属性需要设置的时候,就可以这样写 , 比如说现在ItcastAnnotation里有2个值,一个color一个value

//  color方法带了缺省值(默认值), 然后value就可以不用写等于, 直接这样赋值即可..编译时就知道是value属性了

 

public static void main(String[] args) throws Exception{

  // TODO Auto-generated method stub


  System.runFinalizersOnExit(true);


  if(AnnotationTest.class.isAnnotationPresent(ItcastAnnotation.class)){


   //反射获取到本类下的注解的实例

   ItcastAnnotation annotation = (ItcastAnnotation)AnnotationTest.class.getAnnotation(ItcastAnnotation.class);


   System.out.println(annotation.color());   // 类上有赋值, 所以不用默认值,如果没有赋值, 那么必须赋默认值, 不然调用报错


   System.out.println(annotation.value()); // 答案abc,因为现在调用额是类上的注解,而不是main方法上的注解,如果是调用main上的注解,
    //那么答案就是xyz.注解返回的值需要看注解是什么时候调用额,而且还要看注解是在那个位子上


   System.out.println(annotation.arrayAttr().length); // 注解 arrayAttr=1 这个数组因为只有一个值, 所以可以直接等号,不然需要加上{}


   System.out.println(annotation.lamp().nextLamp().name()); //RED的nextLamp(); GREE


   System.out.println(annotation.annotationAttr().value()); //注解的返回值还是一个注解, 然后注解里有一个value方法..


  } 
}

 
  Method mainMethod = AnnotationTest.class.getMethod("main", String[].class);  //通过反射获取到main方法. 它的值是一个String类型


  ItcastAnnotation annotation2 = (ItcastAnnotation)mainMethod.getAnnotation(ItcastAnnotation.class); //获取到main方法上的注解类型


  System.out.println(annotation2.value());    //答案是xyz

 

 

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值