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

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

 

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

哪个班的学生,这个时候可以为胸牌在增加一个属性进行区分。加了属性的标记效果为:@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. com.alibaba.fastjson.JSON对类对象的序列化与反序列化

    1. 目标 把类的对象存储到字符串可存储 2. 类定义 public interface JsonInterface { } mport com.alibaba.fastjson.JSON; impo ...

  2. es6学习笔记9--函数的扩展

    函数参数的默认值 基本用法 在ES6之前,不能直接为函数的参数指定默认值,为了避免这个问题,通常需要先判断一下参数y是否被赋值,如果没有,再等于默认值. ES6允许为函数的参数设置默认值,即直接写在参 ...

  3. Android系统版本、Platform版本、SDK版本、gradle修改

    虽然之前分析了gradle,但是在eclipse导入Android studio的时候,各个版本出现的问题还是很模糊,下面对各种版本进行一下说明: 参考资料: https://developer.an ...

  4. 部署---阿里云服务器,linux, ubuntu ,部署django用到的一些命令

    部署项目<下课说>APP时,总结出的一些命令和方法细节 Linux.ubuntu.django.uwsgi.nginx.mysql 里面有些是查找的资料,我也不大懂[手动笑哭],这还是部署 ...

  5. 如何查看是否安装.NET Framework、.NET Framework的版本号以及CLR版本号

    查看是否安装.NET Framework→%SystemRoot%\System32→如果有mscoree.dll文件,表明.NET Framework已安装 查看安装了哪些版本的.NET Framw ...

  6. 表达式树(Expression Trees)

    [翻译]表达式树(Expression Trees) 原文地址:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/con ...

  7. java数组创建

    java数组创建:int[] number = new int[10]; int[]:表明这是一个数组 new int[10]:给前面的数组类型的number变量分配10个int类型的空间大小

  8. Mybatis中trim标签的用法

    select * from t_user <trim prefix="WHERE" prefixOverrides="and"> <if te ...

  9. Centos 7 安装后设置

    1.宽带连接 终端: nm-connection-editor 添加:DSL 另外一篇:Centos7宽带连接 2.输入法设置 设置-->区域和语言--> + -->搜索chines ...

  10. HDU4162(最小循环表示)

    Shape Number Time Limit: 24000/12000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...