Java注解的介绍

来源:互联网 发布:淘宝待发货订单生成器 编辑:程序博客网 时间:2024/05/17 22:43

最近学了学java的注解,在这里跟大家分享下~

注解有什么用??个人感觉最主要是装13用的。。开个玩笑~注解还是很有用的,现在好多框架都使用了注解,如果不理解这个就读不懂人家代码,怎么成大神。而且使用注解会是程序更简洁,更容易被人理解(据说是,我还没什么感觉),废话不多说,先来看看注解的简单应用;

JDK自带了一些注解,而且我们经常看到,像@Override代表重写父类方法(不多说),@Deprecated代表已过时(这个大家应该也常见,比如一个接口有一些方法给大家用,有一天突然发现有个方法考虑的不够全面,需要改改,但是又有人已经实现你的接口了,那就可以将该方法标记为已过时),@SuppressWarnings("")忽略某些警告(参数给deprecated就可以忽略上面的过时警告了,你有张良计我有过墙梯,哈哈哈)

还有一些注解如果有会像Spring的框架之类的童鞋应该会知道,我这就不说了(我还不会呢)

注解分为几类:按来源分就可以分为jdk注解,三方注解(主要是框架)和我们自定义的注解,按运行机制分可以分为源码注解,编译注解和运行注解,最后还有个很NB的东西叫元注解,这个是用来给注解加注解的。。。一会解释,我们先来看看如何声明注解。

接口的声明相信都很熟悉了,而注解和接口很像,用@interface声明

public @interface MyAnnotation{

String name();

int age() default 18;

可以声明成员变量,没有成员的叫做标示注解,成员类型有限制,可以使用基本类型,引用类型只能是String,Class,Annotation和Enumeration,default代表了成员的默认值,如果只有一个成员,那名字必须是value,这个规定和一个快捷用法有关,因为我们用的时候对于只有一个成员的注解是可以省略"名字="的,参数直接跟value值,这个下面会举例

}

@MyAnnotation(name="hello",age=23)

public calss A{... }

当只有一个成员的时候可以简洁写成

@MyAnnotation("hello")//所以要求注解的成员名要是value,但编译不会报错,貌似是一种规定,类似驼峰法则这样的

public calss A{... }

元注解:

/*
 * @Retention保留时间,value:
 * RetentionPolicv.CLASS 记录在class文件,java运行时JVM不可获取Annotation信息
 * RetentionPolicv.RUNTIME 记录在class文件,运行时也可获取注解信息(反射)
 * RetentionPolicv.SOURCE 只保留在源代码,被编译器丢弃
 * @Target指定注解可以修饰哪些单元(ElementType.值)
 *   1.CONSTRUCTOR:用于描述构造器
    2.FIELD:用于描述域
    3.LOCAL_VARIABLE:用于描述局部变量
    4.METHOD:用于描述方法
    5.PACKAGE:用于描述包
    6.PARAMETER:用于描述参数
    7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
 * @Documented API文档会提取该注解的说明信息显示
 * @Inherited 具有继承性,被该注解修饰的注解所修饰的类的子类会自动添加注解 ,继承的是类注解
 * java 8
 * @Repeatable(Test.class)可重复注解
 * 
 */

@Retention(value=RetentionPolicy.RUNTIME)
//@Target(ElementType.TYPE)
@Documented

@Inherited
@interface Test{
String name() default "zhangsan";
int age() default 18;
}

利用反射解析注解

try {
//类注解
Class c = Class.forName("com.hao.annotation.Demo");
boolean isExist = c.isAnnotationPresent(Test.class);//找到类上的注释
if(isExist){
Test t = (Test) c.getAnnotation(Test.class);
System.out.println(t.name()+"---"+t.age());
}
//方法注解
Method[] methods = c.getMethods();
for(Method m : methods){
boolean isMexist = m.isAnnotationPresent(Test.class);
if(isMexist){
Test t = (Test) m.getAnnotation(Test.class);
System.out.println(t.age());
}
}

//获取xxx方法所有注解
Annotation[] array = c.getMethod("xxx").getAnnotations();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

0 0