Java基础之注解

编码习惯:类名/属性名是名词或者形容词加名词,方法名是动词或者是动词加名词
了解注解,
覆盖equals方法时类型参数不能是除Object之外的类型,否则equals不起作用,因为被调用的还是Object的equals方法,加上
注解@Override即可解决;
注解相当于一种标记,开发工具或者其它工具可以用反射来了解类及各种元素上有无何种标记,然后做相应的处理;注解可以加在
包、类、字段、方法、方法的参数以及局部变量上。
java.lang包的说明里有jdk提供的最基本的annotation.

元注解、元数据、元信息,信息的信息就叫元信息,注解的注解叫元注解。

 

// class文件不叫字节码 类加载器加载class文件到内存后会对加载的东西会进行处理 
// 处理完完之后得到的在内存的二进制东西就叫字节码
// javac编译java文件生成.class文件 类加载器加载.class文件生成字节码
// 相应地一个注解的生命周期也有三个阶段:源文件(SOURCE) class文件(CLASS) 内存中的字节码(RUNTIME)
// 默认值 是CLASS,@Override、@SuppressWarnings保留的阶段是SOURCE(doc),@Deprecated保留的阶段是RUNTIME(doc),
// 否则运行时不能知道是否有过时方法并输出警告,需要记忆么?张老师讲了多次都不知道保留策略的枚举名称!记住反而stupid!
// class、interface、enum、@interface 都是Type
// ElementType的doc可查看所有种类
@Retention(RetentionPolicy.RUNTIME) // 保留到运行期间 属性的名称value,类型为枚举
@Target({ ElementType.METHOD, ElementType.TYPE })
public @interface ItcastAnnotation {
	// 默认public abstract,应用时认为这个注解有一个属性color需要设置,可以指定默认值
	String color() default "blue";

	String value();

	// 数组类型的属性
	int[]arrayAttr() default { 3, 4, 5 };

	// 枚举类型的属性
	EnumTest.TrafficLamp lamp() default EnumTest.TrafficLamp.RED;

	// 注解类型的属性 这些可以设置什么属性可以在java language specification查看 ,不是doc
	MetaAnnotation annotationAttr() default @MetaAnnotation("lhm")
	;// @MetaAnnotation("lhm")可以认为是@MetaAnnotation类的一个实例对象

}
public @interface MetaAnnotation {
	String value();
}
//数组也可以写成arrayAttr={1}或arrayAttr=1,即数组只有一个元素可以不写大括号
@ItcastAnnotation(annotationAttr = @MetaAnnotation("flx") , color = "red", value = "abc", arrayAttr = { 1, 2, 3 })
public class AnnotationTest {

	@SuppressWarnings("deprecation") // 只有value属性需要设置(可以有其他属性但其他属性要有默认值)的时候可以省略value=
	@ItcastAnnotation("xyz")
	public static void main(String[] args) {
		System.runFinalizersOnExit(true);// 示例,被废弃的方法
		if (AnnotationTest.class.isAnnotationPresent(ItcastAnnotation.class)) {
			ItcastAnnotation annotation = AnnotationTest.class.getAnnotation(ItcastAnnotation.class);
			System.out.println(annotation.color());// red
			System.out.println(annotation.value());// abc
			System.out.println(annotation.arrayAttr().length);// 3(asList弄不出来,1.4、1.5区别)
			System.out.println(annotation.lamp().nextLamp().name());// GREEN
			System.out.println(annotation.annotationAttr().value());// flx(注解的返回值还是注解,而这个返回的注解身上又有一个属性)

		}

	}

	@Deprecated
	public static void sayHello() {
		System.out.println("hi, itcast");
	}

}

 

 

 

 

 

 

 

posted @ 2016-10-23 14:52  john8169  阅读(120)  评论(0编辑  收藏  举报