35_张孝祥Java高新技术_为注解增加各种属性
注解的作用之所以那么强大,就是因为它有属性
- 注解很像接口,属性很像方法.
- 什么是注解的属性
- 一个注解相当于一个胸牌,如果你胸前贴了胸牌,就是传智播客的学生,否则,就不是。如果还想区分出事传智播客
哪个班的学生,这个时候可以为胸牌在增加一个属性进行区分。加了属性的标记效果为:@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高新技术_为注解增加各种属性的更多相关文章
- 张孝祥Java高新技术汇总
一.自动装箱和拆箱: 在Java中有8种基本数据类型:byte,short,int,long,float,double,char,boolean.而基本数据类型不是对象,这时人们给他们定义了包装类,使 ...
- 张孝祥java高新技术 --- jkd1.5 新特性 -- 精华总结
1. 抽象方法的使用 如果一个方法中大量出现if语句, 那么, 就应该考虑使用抽象来处理. 如下例: package com.lxl; public class Weekend { //周日 publ ...
- 张孝祥java高新技术 --- jkd1.5 新特性
1. 静态导入 import static java.lang.Math.max; 2. 可变参数 3. 自动装箱,拆箱 4. 枚举
- Java核心_内省
Java核心_内省 查看java的api,发现有一个包java.bean咦,这个包是干什么的呢,原来,它是用来操作JavaBean对象的! 一.内省操作①JavaBean:一种特殊的Java类无参构造 ...
- Java高新技术 注解
Java高新技术 注解 知识概要: (1)了解注解 (2)注解的应用结构图 (3)@Retention(RetentionPolicy.RUNTIME) ...
- 黑马程序员——【Java高新技术】——JavaBean、注解
---------- android培训.java培训.期待与您交流! ---------- 一.JavaBean * 通过内省引入JavaBean:内省对应的英文全程是IntroSpector.在J ...
- Java学习_注解
使用注解 注解是放在Java源码的类.方法.字段.参数前的一种特殊"注释". 1 // this is a component: 2 @Resource("hello&q ...
- Java高新技术 Myeclipse 介绍
Java高新技术 Myeclipse 介绍 知识概述: (1)Myeclipse开发工具介绍 (2)Myeclipse常用开发步骤详解 ...
- 传智播客张孝祥java邮件开发随笔01
01_传智播客张孝祥java邮件开发_课程价值与目标介绍 02_传智播客张孝祥java邮件开发_邮件方面的基本常识 03_传智播客张孝祥java邮件开发_手工体验smtp和pop3协议 第3课时 关于 ...
随机推荐
- com.alibaba.fastjson.JSON对类对象的序列化与反序列化
1. 目标 把类的对象存储到字符串可存储 2. 类定义 public interface JsonInterface { } mport com.alibaba.fastjson.JSON; impo ...
- es6学习笔记9--函数的扩展
函数参数的默认值 基本用法 在ES6之前,不能直接为函数的参数指定默认值,为了避免这个问题,通常需要先判断一下参数y是否被赋值,如果没有,再等于默认值. ES6允许为函数的参数设置默认值,即直接写在参 ...
- Android系统版本、Platform版本、SDK版本、gradle修改
虽然之前分析了gradle,但是在eclipse导入Android studio的时候,各个版本出现的问题还是很模糊,下面对各种版本进行一下说明: 参考资料: https://developer.an ...
- 部署---阿里云服务器,linux, ubuntu ,部署django用到的一些命令
部署项目<下课说>APP时,总结出的一些命令和方法细节 Linux.ubuntu.django.uwsgi.nginx.mysql 里面有些是查找的资料,我也不大懂[手动笑哭],这还是部署 ...
- 如何查看是否安装.NET Framework、.NET Framework的版本号以及CLR版本号
查看是否安装.NET Framework→%SystemRoot%\System32→如果有mscoree.dll文件,表明.NET Framework已安装 查看安装了哪些版本的.NET Framw ...
- 表达式树(Expression Trees)
[翻译]表达式树(Expression Trees) 原文地址:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/con ...
- java数组创建
java数组创建:int[] number = new int[10]; int[]:表明这是一个数组 new int[10]:给前面的数组类型的number变量分配10个int类型的空间大小
- Mybatis中trim标签的用法
select * from t_user <trim prefix="WHERE" prefixOverrides="and"> <if te ...
- Centos 7 安装后设置
1.宽带连接 终端: nm-connection-editor 添加:DSL 另外一篇:Centos7宽带连接 2.输入法设置 设置-->区域和语言--> + -->搜索chines ...
- HDU4162(最小循环表示)
Shape Number Time Limit: 24000/12000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...