注解的基本类型及综合应用

/**
 * 第三十三集
 * 了解注解及Java提供的几个注解的基本类型
 * Suppress  vt.镇压,压制;止住,忍住;禁止发表;阻止…的生长(或发展)
 * 收尾:每个类都有一个特殊的方法finalizer,它不能被直接调用,而被JVM在
 * 适当的时候调用,通常用来处理一些清理资源的工作,因此称为收尾机制。
 * 先通过@SuppressWarnings的应用让大家直观的了解:
 * --通过System.runFinalizerOnExit(true);的编译警告引出
 * --@SuppressWarnings("deprecation")
 * -@Deprecated
 * ---直接在刚才的类中增加一个方法,并加上@Deprecated标注,在另外
 * 一个类中调用这个方法。
 * -@Override
 * ---public boolean equals (Reflect other)方法与HashSet结合讲解
 * 总结:
 * --注解相当于一种标记,加了注解就等于加上了某种标记,没加则等于没有某种标记
 * 
 * deprecated 过时的
 * 
 * 当我要用这个注解前提是人家要写好这个注解,注解就相当于一个特殊的类
 * 像写接口一样的写。。z
 * --注解类定义@interface A{}
 * --应用注解类的类@A ClassB{}
 * --对“应用注解类的类”进行反射操作的类Class C {
 * B.class.isAnnotionPresent(A.class) 
 * A a = B.class.getAnnotion(A.class)
 * }
 * 
 * 为注解增加高级属性
 * 数组类型的属性
 * --int[] arrayAttr(){1,2,3};
 * --@MyAnnotation(arrayAttr={2,3,4})
 * --如果这个数组属性中只有一个元素,这时候属性值部分可以省略大括号
 * 枚举类型的属性
 * --EnumTest.TrafficLamp lamp();
 * --@MyAnnotation(lamp=EnumTest.Traffic.GREEN)
 * 注解类型的属性:
 * --MetaAnnotation annotationAttr()default@MetaAnntation("xxxx")
 * --@MyAnnotation(annotationAtrr=@MetaAnnotation("yyy"))
 * --可以认为上面这个@MyAnnotation是MyAnnotation类的一个实例对象,
 * 同样的道理,可以认为上面的这个@MetaAnnotation是MetaAnnotation类的一个实例对象,
 * 调用代码如下:
 * MetaAnnotation ma = myAnnotation annotationAttr();
 * System.out.println(ma.value);
 * 注解的详细语法可以通过看java语言规范了解,
 * 即看java的language specification 规格;详述;说明书
 * java语言规范 langspec-3.0
 * 注解的返回类型是八种基本类型 也可以是class类型 可以是枚举类型 可以是注解类型 
 * 也可以是这些类型的数组类型
 * 
 * 
 */

package cn.itcast.day2;


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


@ItcastAnnotation(annotationAttr=@MetaAnnotation("flx"), color = "red", value = "abc", arrayAttr = { 1,2,3 })
public class AnnotationTest {


/**
* 压缩警告  
* main方法必须写在一个类里面但是不是必须属于类的成员
* 如果只有value时就不直接写成这种形式@ItcastAnnotation("abc")
* 因为还有color属性 所以要为color设置默认属性
*/
@SuppressWarnings("deprecation")
@ItcastAnnotation("abc")
public static void main(String[] args) {
// TODO Auto-generated method stub
System.runFinalizersOnExit(true);
if(AnnotationTest.class.isAnnotationPresent(ItcastAnnotation.class))
{
ItcastAnnotation annotation 
= (ItcastAnnotation)AnnotationTest.class.getAnnotation(ItcastAnnotation.class);
/**
* 设计注解的时候里面加了说明将注解一直保留到运行
* @Retention(RetentionPolicy.RUNTIME)
* class里面的文件不是字节码
* 一个注解的生命周期有三个阶段
* --源文件是一个阶段--class文件是一个阶段--内存的字节码是一个阶段
*/
System.out.println(annotation.color());
System.out.println(annotation.value());
/**
* 这是一个数字无法打印,只能打印其属性
*/
System.out.println(annotation.arrayAttr().length);
System.out.println(annotation.lamp().nextLamp());
/**
* 注解的返回值还是一个注解
*/
System.out.println(annotation.annotationAttr().value());
}
}
/**
* 即使作废了也不能彻底的干掉,新人不要用,老人还可以用
* Deprecated
* 代码升级了,将老的代码作废
*/
@Deprecated
public static void sayHello(){
System.out.println("hi,传智播客");
}


}


package cn.itcast.day2;


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


import cn.itcast.day1.EnumTest;




/**
 * 第三十四集 注解的定义与反射调用
 * 自定义注解及其应用
 * 定义一个简单的注解:public@interface MyAnnotation{}
 * 把它加在某个类上:@MyAnnotation public class AnnotationTest{}
 * 用反射进行测试AnnotationTest的定义上是否有@MyAnnotation
 * 根据反射测试的问题,引出@Retention元注解的讲解,其三取值:
 * RetetionPolicy.SOURCE、
 * RetetionPolicy.CLASS、
 * RetetionPolicy.RUNTIME;
 * 分别对应:java源文件--class文件--内存字节码。
 * --思考:@Override、@SuppressWarning和@Deprecated这三个注解
 * 的属性值分别是什么?
 * 演示和讲解@Target元注解
 * --Target的默认值为任何元素,设置Target等于ElementType.METHOD,
 * 原来加载类上的注解就报错了,改为用数组方式设置{ElementType.METHOD,ElementType}
 * 就可以了
 * 元注解以及其枚举属性值不用记,只要会看到jdk提供那几个基本注解的API
 * 
 */




/**
 * 这是一个注解 标识是@interface
 * 把这个注解用在类上
 * 这是我定义注解,在定义注解的时候又加注解
 * 这个元注解。是为我的注解服务的
 * 信息的信息叫做元信息,注解的注解叫做元注解
 * @Target(value = { ElementType.METHOD })
 * 这个的意思是这个注解只能放在方法上
 * ElementType.TYPE 既能在方法上,又能在类上
 * 为甚是type而不是class  Class的父类是Type
 * 不仅可以加在Class上面,也可以在接口,枚举上面
 * 这一类事物用Type来描述更加准确,在1.5里面才出现
 * Enum ElementType  
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(value = { ElementType.METHOD,ElementType.TYPE })
public @interface ItcastAnnotation {

/**
* 它和接口很像,知道它是抽象的公共的但是不用加
* 表示这个类有一个这样的方法
* @ItcastAnnotation(color = "red")
* 方法返回一个字符串
*/
String color() default "bule";
String value();
int[] arrayAttr() default {3,4,5};

EnumTest.TrafficLamp lamp() default EnumTest.TrafficLamp.RED;
MetaAnnotation annotationAttr() default @MetaAnnotation(value = "lhm");
}


/**
 * 第三十五集 为注解增加基本的属性
 * 什么事注解的属性
 * --一个注解相当于一个胸牌,如果你胸前贴了胸牌,就是传智播客的学生,否则,就不是。
 * 如果还想区分出来时传智播客哪个班的学生,这时候可以为胸牌在增加一个属性进行区分。
 * 加了属性的标记效果为:@MyAnnotation(color="red")
 * 定义基本类型的属性和反应属性:
 * --在注解中增加String "color()";
 * --@MyAnnotation(color="red")
 * 用反射的方式获得注解对应的实例对象后,再通过该对象调用属性对应的方法
 * --MyAnnotation a = (MyAnnotation)AnnotationTest.class.getAnnotation(MyAnnotation.class)
 * --System.out.println(a.color());
 * --可以认为上面这个@MyAnnotation是MyAnnotation类的一个实例对象
 * 为属性指定缺省值
 * --String color() default"yellow";
 * value属性
 * --String value() default "zxx";
 * --如果注解中有一个名称为value的属性,且你只想设置value属性
 * (即其他属性都采用默认值)
 * 
 */

package cn.itcast.day2;

/**
 * 为增加高级类型的属性--注解类型的属性
 * @author Administrator
 *
 */
public @interface MetaAnnotation {
String value();
}







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值