最近学了学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();
}