注解的作用之所以那么强大,就是因为它有属性

  • 注解很像接口,属性很像方法.

 

  • 什么是注解的属性
    • 一个注解相当于一个胸牌,如果你胸前贴了胸牌,就是传智播客的学生,否则,就不是。如果还想区分出事传智播客

哪个班的学生,这个时候可以为胸牌在增加一个属性进行区分。加了属性的标记效果为:@MyAnnotation(color=”red”)

  • 定义基本类型的属性和应用属性:
    • 在注解类中增加String color();//实际上默认是像接口一样,是 public final的
    • @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 com.itcast.day2;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; import com.itcast.day1.EnumTest; /**
* 定义注解
* @author liujl
*
*/ //Retention默认为class阶段,注解MyAnnotation的生命周期为运行阶段
@Retention(RetentionPolicy.RUNTIME) //默认值为任何元素,若在数组里只填写METHOD则使用注解的类编译报错
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface MyAnnotation {
String value();//牛逼的名称,居然可以在@时默认不写名字
String color() default "blue"; //String类型
int[] arrayAttr() default {1,2,3};//数组类型
Class clazz() default java.lang.String.class;//字节码
EnumTest.TrafficLamp lamp() default EnumTest.TrafficLamp.GREEN;
MetaAnnotation metaAnnotation() default @MetaAnnotation("test"); } /**
* Rentention
* 关于java程序的三个阶段
* source阶段: .java--->编译--->.class
* class阶段: .class-->进入jvm检查阶段--->字节码
* runtime阶段: 已经通过安全检查--被调入内存,被视为字节码
*
*/

package com.itcast.day2;

import com.itcast.day1.EnumTest;
/**
* 使用注解MyAnnotation
* @author hp
*
*/
@MyAnnotation(value="123",color="456",arrayAttr=333,clazz=java.lang.Integer.class,lamp=EnumTest.TrafficLamp.RED,metaAnnotation=@MetaAnnotation("334455"))
public class MyAnnotationTest {
}

package com.itcast.day2;
/**
* 用反射的方式得到注解,并打印其属性
* @author liujl
*
*/
public class MyAnnotationTestRun {
public static void main(String[] args) {
if(MyAnnotationTest.class.isAnnotationPresent(MyAnnotation.class)){
MyAnnotation MyAnnotation=MyAnnotationTest.class.getAnnotation(MyAnnotation.class);
//value很牛逼,如果注解中只有它时可以省略名称-value,而直接填值"xxx"
System.out.println(MyAnnotation.value());
System.out.println(MyAnnotation.color());//String
System.out.println(MyAnnotation.clazz().getName());//字节码
System.out.println(MyAnnotation.arrayAttr()[0]);//数组
System.out.println(MyAnnotation.lamp().nextLamp());//枚举 红灯下一盏是绿灯
System.out.println(MyAnnotation.metaAnnotation().value());//注解 注解的属性也是一个注解 @代表"实例化"一个注解 }
}
}
/**
运行结果:
123
456
java.lang.Integer
333
GREEN : 45
334455
*/

package com.itcast.day1;

/**
* 注解 MyAnnotation用到的枚举类型
* @author liujl
*
*/
public class EnumTest { public enum TrafficLamp{ //RED,GREEN,YELLOW这些元素都是枚举TrafficLame的子类的实例
RED(30){//内部类
@Override
public TrafficLamp nextLamp() {//实现抽象方法
return GREEN;
}
},
GREEN(45){
@Override
public TrafficLamp nextLamp() {
return YELLOW;
}
},
YELLOW(5)/*调用YELLOW子类有参数构造,子类.super(5)调用了父类TrafficLamp的有参构造*/{
@Override
public TrafficLamp nextLamp() {
return RED;
}
};
private int time;
public abstract TrafficLamp nextLamp();//抽象方法
private TrafficLamp(int time){this.time=time;}//构造方法要私有化 @Override
public String toString() {
return this==RED?"RED : "+this.time:this==GREEN?"GREEN : "+this.time:"YELLOW : "+this.time;
}
}
}

Java Language and Virtual Machine Specifications  ( Java语言和虚拟机说明书)http://docs.oracle.com/javase/specs/index.html

java1.5说明书  http://docs.oracle.com/javase/specs/jls/se5.0/html/j3TOC.html

打开后,搜索   Annotation Types ,就可以知道关于注解的详细介绍。

35_张孝祥Java高新技术_为注解增加各种属性的更多相关文章

  1. 张孝祥Java高新技术汇总

    一.自动装箱和拆箱: 在Java中有8种基本数据类型:byte,short,int,long,float,double,char,boolean.而基本数据类型不是对象,这时人们给他们定义了包装类,使 ...

  2. 张孝祥java高新技术 --- jkd1.5 新特性 -- 精华总结

    1. 抽象方法的使用 如果一个方法中大量出现if语句, 那么, 就应该考虑使用抽象来处理. 如下例: package com.lxl; public class Weekend { //周日 publ ...

  3. 张孝祥java高新技术 --- jkd1.5 新特性

    1. 静态导入 import static java.lang.Math.max; 2. 可变参数 3. 自动装箱,拆箱 4. 枚举

  4. Java核心_内省

    Java核心_内省 查看java的api,发现有一个包java.bean咦,这个包是干什么的呢,原来,它是用来操作JavaBean对象的! 一.内省操作①JavaBean:一种特殊的Java类无参构造 ...

  5. Java高新技术 注解

      Java高新技术 注解 知识概要:                  (1)了解注解 (2)注解的应用结构图 (3)@Retention(RetentionPolicy.RUNTIME)    ...

  6. 黑马程序员——【Java高新技术】——JavaBean、注解

    ---------- android培训.java培训.期待与您交流! ---------- 一.JavaBean * 通过内省引入JavaBean:内省对应的英文全程是IntroSpector.在J ...

  7. Java学习_注解

    使用注解 注解是放在Java源码的类.方法.字段.参数前的一种特殊"注释". 1 // this is a component: 2 @Resource("hello&q ...

  8. Java高新技术 Myeclipse 介绍

      Java高新技术   Myeclipse 介绍 知识概述:              (1)Myeclipse开发工具介绍 (2)Myeclipse常用开发步骤详解               ...

  9. 传智播客张孝祥java邮件开发随笔01

    01_传智播客张孝祥java邮件开发_课程价值与目标介绍 02_传智播客张孝祥java邮件开发_邮件方面的基本常识 03_传智播客张孝祥java邮件开发_手工体验smtp和pop3协议 第3课时 关于 ...

随机推荐

  1. LVS+Heartbeat 高可用集群方案操作记录

    之前分别介绍了LVS基础知识和Heartbeat基础知识, 今天这里简单说下LVS+Heartbeat实现高可用web集群方案的操作说明. Heartbeat 项目是 Linux-HA 工程的一个组成 ...

  2. 开启Centos网卡失败的解决办法

    虚拟机安装了Centos,使用ip addr命令查看网卡,但是ens33没有ip地址,按照网上说的,修改ens33网卡的配置文件: vi /etc/sysconfig/network-scripts/ ...

  3. C# 最大二叉堆算法

    C#练习二叉堆算法. namespace 算法 { /// <summary> /// 最大堆 /// </summary> /// <typeparam name=&q ...

  4. Python发送短信提醒

    Python发送短信可借助腾讯云平台提供的短信服务 发送短信需要的及格参数: 1.SDK_AppID和SDK_Key 2.签名: 3.模板ID 下面贴出源码DEMO: from qcloudsms_p ...

  5. Java虚拟机--虚拟机字节码执行引擎

    Java虚拟机--虚拟机字节码执行引擎 所有的Java虚拟机的执行引擎都是一致的:输入的是字节码文件,处理过程是字节码解析的等效过程,输出的是执行结果. 运行时栈帧结构 用于支持虚拟机进行方法调用和方 ...

  6. Mac下,(OS系统)IDEA 逆向工程,生成 hibernate 映射文件以及对应的javaBean(类似于eclipse)

    找了好久,逆向工程生成javabean的,在Macbook的OS系统下使用idea生成. 参考博客:http://m.blog.csdn.net/quan20111992/article/detail ...

  7. Mybatis逆向生成代碼

    Idea 单模块 1.在pom.xml中添加依赖 <build> <plugins> <plugin> <groupId>org.mybatis.gen ...

  8. 纯HTML和CSS实现JD轮播图

    博主使用了纯HTML和CSS实现了JD的轮播图,没有加动态效果,主要是使用了定位的知识.  ,如图为两个侧边箭头图片(其实实际中应该使用CSS3的图标字体,这里没有使用). <!DOCTYPE ...

  9. sql语句之from子句

    如何从表中查询一个字端的数据 select  字段名  from  表名: 演示:从s_emp表中把月薪查询出来 select salary from s_emp ; (分号代表结束) 如何从表中查询 ...

  10. CPU单核多核区别【转载】

    CPU个数.CPU核心数.CPU线程数 我们在选购电脑的时候,CPU是一个需要考虑到核心因素,因为它决定了电脑的性能等级.CPU从早期的单核,发展到现在的双核,多核.CPU除了核心数之外,还有线程数之 ...