黑马程序员:Java基础总结



java注解

 
ASP.Net+Android+IO开发

.Net培训
、期待与您交流!




java注解


lang包中的基本注解

@SuppressWarnings

通过System.runFinalizersOnExit(true);的编译警告引出@SuppressWarnings("deprecation") 


@Deprecated

直接在刚才的类中增加一个方法,并加上@Deprecated标注,在另外一个类中调用这个方法。


@Override

public boolean equals(Reflect other)方法与HashSet结合讲解


总结:

注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事。标记可以加在包,类,字段,方法,方法的参数以及局部变量上。

看java.lang包,可看到JDK中提供的最基本的annotation。 



注解的应用结构

//定义一个注解类
@interface 
annotation 
{
}
//应用了“注解类”的类
@annotation
class 
B{}
//对“应用了注解类的类”进行反射操作的类
class 
c{
      { 
annotation
.
class 
.isAnnotation();}
      {B. 
class
.isAnnotationPresent(
annotation 
.
class
);}
      { 
annotation
.
class 
.getAnnotation(
annotation

class
);}
}

 boolean isAnnotation()
          如果此 Class 对象表示一个注释类型则返回 true。
 boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)
          如果指定类型的注释存在于此元素上,则返回 true,否则返回 false。
<A extends Annotation>
A
getAnnotation(Class<A> annotationClass)
          如果存在该元素的指定类型的注释,则返回这些注释,否则返回 null。
 Annotation[] getAnnotations()
          返回此元素上存在的所有注释。


自定义注解

元注解
Documented 指示某一类型的注释将通过 javadoc 和类似的默认工具进行文档化。
Inherited 指示注释类型被自动继承。
Retention 指示注释类型的注释要保留多久。
Target 指示注释类型所适用的程序元素的种类。

注释类型 Retention    必需元素摘要

 RetentionPolicy value

枚举 RetentionPolicy    枚举常量摘要

CLASS
          编译器将把注释记录在类文件中,但在运行时 VM 不需要保留注释。
RUNTIME
          编译器将把注释记录在类文件中,在运行时 VM 将保留注释,因此可以反射性地读取。
SOURCE
          编译器要丢弃的注释。

RetetionPolicy.SOURCE、RetetionPolicy.CLASS、RetetionPolicy.RUNTIME;分别对应:java源文件-->class文件-->内存中的字节码。


@Retention
(RetentionPolicy.
SOURCE
)
@interface 
annotation 
{
}
 思考: @Override、@SuppressWarnings和@Deprecated 对应的是 
SOURCE, 
SOURCE , 
RUNTIME

注释类型 Target    必需元素摘要

 ElementType[] value

枚举 ElementType    枚举常量摘要

ANNOTATION_TYPE
          注释类型声明
CONSTRUCTOR
          构造方法声明
FIELD
          字段声明(包括枚举常量)
LOCAL_VARIABLE
          局部变量声明
METHOD
          方法声明
PACKAGE
          包声明
PARAMETER
          参数声明
TYPE
          类、接口(包括注释类型)或枚举声明

@Retention
(RetentionPolicy.
SOURCE
)
@Target
(value = { ElementType.
TYPE
, ElementType.
METHOD 
}) //常用
@interface 
annotation 
{
}


注解增加属性
定义基本类型的属性和应用属性:

在注解类中增加String color();

@MyAnnotation(color="red")


用反射方式获得注解对应的实例对象后,再通过该对象调用属性对应的方法

MyAnnotation a = (MyAnnotation)AnnotationTest.class.getAnnotation(MyAnnotation.class);

System.out.println(a.color());

可以认为上面这个@MyAnnotation是MyAnnotaion类的一个实例对象


为属性指定缺省值:

 String value() 
default 
"default" 
;


value属性可简写:

String value() default "zxx";

如果注解中有一个名称为value的属性,且你只想设置value属性(即其他属性都采用默认值或者你只有一个value属性),那么可以省略value=部分,例如:@MyAnnotation("lhm")。


数组类型的属性

int [] arrayAttr() default {1,2,3};

@MyAnnotation(arrayAttr={2,3,4})

如果数组属性中只有一个元素,这时候属性值部分可以省略大括


枚举类型的属性

EnumTest.TrafficLamp lamp() ;

@MyAnnotation(lamp=EnumTest.TrafficLamp.GREEN)

注解类型的属性:

MetaAnnotation annotationAttr() default @MetaAnnotation("xxxx");

@MyAnnotation(annotationAttr=@MetaAnnotation(“yyy”) )

可以认为上面这个@MyAnnotation是MyAnnotaion类的一个实例对象,同样的道理,可以认为上面这个@MetaAnnotation是MetaAnnotation类的一个实例对象,调用代码如下:

     MetaAnnotation ma =  myAnnotation.annotationAttr();

     System.out.println(ma.value());



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

@annotation
(lap = Lap.
YELLOW
, value = 
"default"
)
public 
class 
Ts0 {
       
public 
static 
void 
main(String[] args) 
throws 
Exception {
             
if 
(Ts0.
class 
.isAnnotationPresent(
annotation

class
)) {
                   
annotation 
anno = (
annotation 
) Ts0.
class
.getAnnotation(
annotation 
.
class
);
                  System. 
out
.println(anno.order().value());
            }
      }
}

// 定义一个注解类
@Retention
(RetentionPolicy.
SOURCE
)
@Target
(value = { ElementType.
TYPE
, ElementType.
METHOD 
})
@interface 
annotation 
{
      String value();

       
int
[] arr() 
default 
{ 1, 2, 3 };

      Lap lap();

       
orAnno 
order() 
default 
@orAnno
(
"123"
);
}

enum 
Lap {
       
RED

GREEN 

YELLOW
;
}

// 另一个注视
@interface 
orAnno 
{
      String value();
}





 
ASP.Net+Android+IO开发

.Net培训
、期待与您交流!

黑马程序员:Java基础总结----java注解的更多相关文章

  1. 黑马程序员+SQL基础(上)

    黑马程序员+SQL基础 ---------------<a href="http://edu.csdn.net"target="blank">ASP ...

  2. 黑马程序员+Winform基础(上)

    黑马程序员+Winform基础 ---------------<a href="http://edu.csdn.net"target="blank"> ...

  3. 黑马程序员:轻松精通Java学习路线连载1-基础篇!

    编程语言Java,已经21岁了.从1995年诞生以来,就一直活跃于企业中,名企应用天猫,百度,知乎......都是Java语言编写,就连现在使用广泛的XMind也是Java编写的.Java应用的广泛已 ...

  4. 黑马程序员_java基础笔记(01)...java的环境搭建

    —————————— ASP.Net+Android+IOS开发..Net培训.期待与您交流!——————————  JavaSE(Java Standard Edtion java标准版)技术概况 ...

  5. 黑马程序员_Java基础组成

    Java语言基础组成 2.1关键字 main不是关键字,但被JVM所识别的名称. 关键字的定义和特点 定义:被Java语言赋予了特殊含义的单词. 特点:关键字中所有字母都为小写. 用于定义数据类型的关 ...

  6. 黑马程序员_Java基础:网络编程总结

    ------- android培训.java培训.期待与您交流! ---------- Java语言是在网络环境下诞生的,它是第一个完全融入网络的语言,虽然不能说它是对支持网络编程做得最好的语言,但是 ...

  7. 黑马程序员_Java基础视频-深入浅出精华版--PPT 文件列表

    \day01\code\第一章_Java概述.ppt;\day01\resource\资料\50道编程题(有精力的同学看看).doc;\day01\resource\资料\Sun_Java程序员认证考 ...

  8. 黑马程序员_Java基础:IO流总结

    ------- android培训.java培训.期待与您交流! ---------- IO流在是java中非常重要,也是应用非常频繁的一种技术.初学者要是能把IO技术的学透,java基础也就能更加牢 ...

  9. 黑马程序员_JAVA基础知识总结2

    ------- android培训.java培训.期待与您交流! ---------- IDE ---> Itegrity Development Environment Java EE --- ...

  10. 黑马程序员_Java基础常识

    一.基础常识 1,软件开发 1)什么是软件?软件:一系列按照特定顺序组织的计算机数据和指令的集合. 常见的软件 系统软件 如:DOS,windows,Linux等. 应用软件: 如:扫雷,迅雷,QQ等 ...

随机推荐

  1. c++ 正則表達式

    正則表達式是经常使用的一种方法.比較有名的类库是boost,可是这个类库在重了.全部就像找一些轻量级的类库. 后来发现准标准的库tr1已经非常方便了,微软vs2008 sp1 以上版本号都支持了.全部 ...

  2. 大约PF_RING/Intel 82599/透明VPN一些事

    接近崩溃的边缘,如今,在医院这篇文章地方的想法,小病,我宁愿不吃药瓶.一台笔记本电脑,但无法上网,我不称职.想知道的东西.唯一可用3G,不开的热点.由于没人给我报销流程.这个周末,我只有一天,由于下雨 ...

  3. INNO SETUP卸载程序中加入自定义窗体

    原文:INNO SETUP卸载程序中加入自定义窗体 [Setup] AppName=My Program AppVerName=My Program v.1.2 DefaultDirName={pf} ...

  4. 一般处理程序装配数据到html页的原理

    相应html页面并保存状态输出原理:(有状态请求)请求页面提交给后台,获取值进行处理之后再根据name标记读取原html文件文字将值替换再一并返回给页面:(在response时替换)比如原模板< ...

  5. javascript模仿块级作用域(第一篇)

    作用域有词法作用域和块级作用域之分,javascript属于词法作用域,而在java.C++中却是块级作用域.在javascript中,只有函数能够创建作用域,作用域是以function作为边界的. ...

  6. Random随机数

    Random类的常用方法 方法 备注 Int nextInt() 返回一个int类型的随机数 Int nextInt(n) 返回一个0到n之间的数,不包括n Double nextDouble() 返 ...

  7. VS多平台开发

    Xamarin技术文档------VS多平台开发   此技术业余时间研究,仅供大家学习参考,不涉及深入研究,有一定开发基础的人员,应该都能较快上手. 一.简介 Xamarin始创于2011年,旨在使移 ...

  8. 编辑控件CKEditor和CKFinder

    -使用HTML编辑控件CKEditor和CKFinder Web开发上有很多HTML的编辑控件,如CKEditor.kindeditor等等,很多都做的很好,本文主要介绍在MVC界面里面,CKEdit ...

  9. Java 多线程编程之九:使用 Executors 和 ThreadPoolExecutor 实现的 Java 线程池的例子

    线程池用来管理工作线程的数量,它持有一个等待被执行的线程的队列.         java.util.concurrent.Executors 提供了 java.util.concurrent.Exe ...

  10. C#排序算法

    随笔- 41  文章- 0  评论- 25  C#排序算法小结   前言 算法这个东西其实在开发中很少用到,特别是web开发中,但是算法也很重要,因为任何的程序,任何的软件,都是由很多的算法和数据结构 ...