package com.base_super.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.Arrays;
/**
* 注解:JDK1.5的新特性
*
* 总结:
* 1:注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具
* 和其他程序可以用反射来了解你的类以及各种元素上有无何种标记,就去干相应的事。标记可以加在包,类,字段,方法,方法的参数以及局部变量上。
* 2,看java.lang包,可看到JDK中提供的最基本的annotation
*
* @author wjw
*
*/
//对“应用注解的类”进行反射操作的类
public class AnnotationTest1 {
public static void main(String[] args) {
// method();
// Annotataion_Class.sayHello();//这就是调用过时方法的效果
method1();
}
//以下这两种注解方式都可以
// @SuppressWarnings(value = { "deprecation" })
@SuppressWarnings("deprecation")//声明该方法是被废弃的方法,让其不用再显示中划线了,但Myeclipse这个功能实现的不好,还在显示
public static void method(){
System.runFinalizersOnExit(true);
}
public static void method1(){
//判断应用注解的类是否是应用的ZiDingYi_Annotation_class这个注解
boolean boo=Annotataion_Class.class.isAnnotationPresent(ZiDingYi_Annotation_class.class);
if(boo){
ZiDingYi_Annotation_class zdy=Annotataion_Class.class.getAnnotation(ZiDingYi_Annotation_class.class);
System.out.println(zdy);
System.out.println("dddddddddd");
System.out.println(zdy.color());//调用那个属性方法
System.out.println(zdy.value());//调用那个属性方法,可以和其他属性一样正常调用
// System.out.println(Arrays.asList(zdy.Arrayarr()));//整形数组不能通过Arrays.asList()方法进行打印,因为int[],不是Object[]
System.out.println(zdy.Arrayarr().length);//这里就打印数组的长度了
}
}
}
/**
* 应用注解 的类
* @author zjw
*
*/
//@ZiDingYi_Annotation_class//把自定义的注解应用在类上
//@ZiDingYi_Annotation_class(color = "yellow",value="aaaaaaaaaa")//因为注解中添加了属性方法,所以这里也要对属性进行初始化
//@ZiDingYi_Annotation_class(value="aaaaaaaaaa")//因为注解中添加了属性方法,所以这里也要对属性进行初始化
//@ZiDingYi_Annotation_class(value="bbb",Arrayarr={1,2,3,4,5,6})//可以为已经赋值过的属性从新赋值
@ZiDingYi_Annotation_class(value="cc",Arrayarr=888)//如果数组只有一个值的话,可以直接这样写,不用再写大括号了
class Annotataion_Class{
@Deprecated//该注解表示该方法过时,建议不使用该方法,但该方法还是可以调用
public static void sayHello(){
System.out.println("hi,Jack!!!!");
}
@Override
public String toString(){
return "@Override这个注解的作用是确保你写的方法是否覆盖了父类的方法";
}
}
/**
* 自定义注解类
* @author zjw
*
*/
//元信息:信息的信息等等
//这是元注解,就是注解的注解
/**
* @Retention元注解,三种取值:
* RetetionPolicy.SOURCE---对应-----java源文件 @Override,@SuppressWarnings都应用在这个阶段
* RetetionPolicy.CLASS----对应-----class文件,这是默认的阶段
* RetetionPolicy.RUNTIME--对应-----内存中的字节码 @Deprecated应用在这个阶段
*
*/
@Retention(value = RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})//这样加这个注解,表示让自定义的注解只能应用到相应的位置上去,本次设置,是应用到方法上,和类上,注意ElementType.METHOD表示应用到方法上,ElementType.TYPE表示应用到类
//至于为什么要用type代替class,因为class实现了type接口,且多个类型(如:enum,@interface)等都实现了type接口
@interface ZiDingYi_Annotation_class{
// String color();//在注解中添加属性方法
String color() default "blue";//在注解中添加属性方法,并设定默认值,此时的话,就可以认为只有下面的value一个属性赋值,就可以简写了 如:@ZiDingYi_Annotation_class(value="aaaaaaaaaa")
String value();//注意这个属性很特殊,如果只有这个属性需要赋值的话,在添加注解时,可以简写 如:@ZiDingYi_Annotation_class(value="aaaaaaaaaa")
int[] Arrayarr() default {2,3,4};//定义整形数组属性方法
}