基础加强- 注解(Annotation)

来源:互联网 发布:bluehost 单独域名续费 编辑:程序博客网 时间:2024/05/22 13:40

---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------

                               注解(Annotation)


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


已经过时的属性如果不加注解,编译不通过
二,常见注解:
@SuppressWarnings(value):压缩警告    ,当value为:derecation(过时)时,意思是压缩过时警告  保留在源文件时期
@Derecated:注时此属性已经过时保留在运行时期   
@Override:是否覆盖父类方法   注解保存在源文件时期
@Retention(参数):保留注解。参数的三种取值:RetentionPolicy.SOURCE源文件时期  RetentionPolicy.CLASS:class文件时期  RetentionPolicy.RUNTIME:程序运行时期 
默认在class文件阶段
@Target(ElementType):标签注解,限制注解标记的位置。ElementType(枚举)的取值ANNOTATION_TYPE:注解上面 CONSTRUCTOR:构造函数上
FIELD:字段上面  LOCAL_VARIABLE:本地变量上  METHOD:方法上面 PACKAGE:包上面 TYPE:类上面

三,自定义注解

1,格式:public @interface 类名{}  如:@interface A{}  定义A注解这个类   
2,注意:在定义一个定义注解类,要在此注解类加上保留注解@Retention(RetentionPolicy.RUNTIME) 此句话的意思是让此自定义的注解保留到运行时
3,注解的三个生命周期:
java源文件(给编译器看的) -  class文件 -  内存中的字节码       
·使用javac命令把源文件反译成class文件时,可能会去掉注解,
·当类加载将硬盘上的 class文件加载进内存时,也可能会去掉注解  


4,RetentionPolicy是一个枚举类。其中有三个元素:SOURCE CLASS RUNTIME   

四,为注解添加属性


1,方法:注解类中的方法都是抽象的,并且权限是public,public abstract可以不用写。在当注解类中定义了方法,使用时当做属性使用可以直接赋值,
自己的对象调用时,还要当做方法调用 如:

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


//给自定义的注解加上两个注解(称为元注解)
@Target(ElementType.TYPE)//此注解为限定自定义注解出现的位置
@Retention(RetentionPolicy.RUNTIME)//此注解为注解的生命周期
public @interface MyselfAnnotation {
//为这个注解类添加一个name方法
public abstract String name();
}
这个类是自定注解类,并给此注解类添加了一个name方法
-----------------------------------------------------------


@MyselfAnnotation(name="haha")//此处调用了自定义注解类被给这个方法进行赋值
public class AnnotationTest {


/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub

}


}
-------------------------------------------------------------------


     public class ReflectAnnotation {


/**
* @param args
* 通过反射来判断一个类是否存在注解,并输入此自定义注解类中的name方法
*/

public static void main(String[] args) throws Exception  {
// TODO Auto-generated method stub
String className = "day01.AnnotationTest";
try {
getAnnotationInfo(className);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


}


public static void getAnnotationInfo(String className)
throws ClassNotFoundException {
//获取此指定类的class对象
Class class1 = Class.forName(className);
//对些类进行判断是否存在注解
if(class1.isAnnotationPresent(MyselfAnnotation.class)){
//如果存在,获取其注解类
MyselfAnnotation annotation = (MyselfAnnotation) class1.getAnnotation(MyselfAnnotation.class);
System.out.println(annotation.name());输入自定义注解中的name方法的返回值
}
else
System.out.println("没有任何的注解");
}


}


2,每注解类都有一个 value()   属性。此value()的属性可以自己指定如果只有一个value属性进行设置,就可以不用写value=了。如果还有其它的属性时,必须加value=.
当你为其它属性设置默认属性值时,value=也可以不写
如:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;


//给自定义的注解加上两个注解(称为元注解)
@Target(ElementType.TYPE)//此注解为限定自定义注解出现的位置
@Retention(RetentionPolicy.RUNTIME)//此注解为注解的生命周期
public @interface MyselfAnnotation {
//为这个注解类添加一个name方法 并设置默认属性值
public abstract String name() default "heihei";
String value();
}
-------------------------------------------------------------------------------
@MyselfAnnotation(name="haha",value="dk"或"dk")//此处调用了自定义注解类被给这个方法进行赋值.当name属性有默认值时可以不用进行设置,value=也可以不用写
public class AnnotationTest {


/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub

}


}
---------------------------------------------------------
3,当属性为一个数组时,且这个数组只有一个值时,可以省略数组的大括号,可以直接进行赋值
如:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;


//给自定义的注解加上两个注解(称为元注解)
@Target(ElementType.TYPE)//此注解为限定自定义注解出现的位置
@Retention(RetentionPolicy.RUNTIME)//此注解为注解的生命周期
public @interface MyselfAnnotation {
int[] arr();//添加一个数组类型的属性
}
@MyselfAnnotation(arr = 1)//当此数组为有一个值时可以这样写
public class AnnotationTest {


/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub

}


}


4,注解的属性类型也可以是一个枚举,注解,Class,基本数据类型,String ,还可以是这此类型的数组类型。注解的实例对象表现形势:@注解类名

---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
0 0
原创粉丝点击