A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yuchunfeng1221 中级黑马   /  2013-10-14 14:05  /  1742 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

张老师视频中说注解用枚举的方式建立了三种注解

1.@ SuppressWarnings(“deprecation”)(压缩注解)保存在Java源文件 阶段

2.@Deprecated   ( 标识过时)保存在CLASS文件阶段

3.@override (标识覆盖父类方法)保存在内存的字节码阶段

我看了视频好多遍,都没明白为什么第一种和第二种注解保存的阶段不一样

谁有更通俗易懂的方式,帮我解释一下?


                     


评分

参与人数 1技术分 +1 收起 理由
黄文伯 + 1

查看全部评分

2 个回复

倒序浏览
回复 使用道具 举报
                                                                Java注解总结,希望能帮到你

一、Annotation概述

从Java5.0版发布以来,5.0平台提供了一个正式的Annotation功能:允许开发者定义、使用自己的Annotation类型。此功能由一个描述Annoation声明的语法,读取Annotation的API,一个使用Annotation修饰的class文件,一个Annotation处理工具(apt)组成。

Annotation并不直接影响代码语义,但是它能以工作的方式被看作类似程序的工具或者类库,它会反过来对正在运行的程序语义有所影响。Annotation可以从源文件、class文件或者以在运行的反射的多种方式被读取。

二、内置注解的使用

1. SupressWarnings:关闭特定的警告信息。例如你在使用泛型的时候未指定类型。

示例一:



[java] view plaincopyprint?
"white-space: pre;"> @SuppressWarnings("deprecation")
public static void main(String[] args){
System.runFinalizersOnExit(true);
}
        @SuppressWarnings("deprecation") public static void main(String[] args){ System.runFinalizersOnExit(true); }
示例二:



[java] view plaincopyprint?
@SuppressWarnings({"rawtypes", "unchecked" })
public staticvoid main(String[] args) {
Mapmap = new TreeMap();
map.put("hello",new Date());
System.out.println(map.get("hello"));
}
@SuppressWarnings({"rawtypes", "unchecked" }) public staticvoid main(String[] args) { Mapmap = new TreeMap(); map.put("hello",new Date()); System.out.println(map.get("hello")); }
2. Deprecated:对不应再使用的方法进行注解。



[java] view plaincopyprint?
public class DeprecatedTest {
@Deprecated
public void doSomething() {
System.out.println("doSomething");
}
public static void main(String[] args) {
DeprecatedTest test = new DeprecatedTest();
test.doSomething();
}
}
public class DeprecatedTest { @Deprecated public void doSomething() { System.out.println("doSomething"); } public static void main(String[] args) { DeprecatedTest test = new DeprecatedTest(); test.doSomething(); } }
3. Override:可以保证编译时Override函数的声明正确性。只能用于方法(不能用于类,包括声明或者其他结构)

示例:



[java] view plaincopyprint?
public class OverrideTest {
@Override
public String toString(){
return "This isOverride";
}
public static void main(String[] args) {
OverrideTest test=new OverrideTest();
System.out.println(test);
}
}
public class OverrideTest { @Override public String toString(){ return "This isOverride"; } public static void main(String[] args) { OverrideTest test=new OverrideTest(); System.out.println(test); } }
三、自定义注解

1. 定义注解的示例一:



[java] view plaincopyprint?
import java.lang.annotation.*;
public @interface MyAnnotation {
String hello() default "fengyan";
String world();
}
import java.lang.annotation.*; public @interface MyAnnotation { String hello() default "fengyan"; String world(); }
2. 定义注解时可以@Retention注解修饰,Retention这个元注释和java编译器处理注释的注释类型方式相关,告诉编译器在处理自定义注释类型的几种不同的选择,其值使用RetentionPolicy枚举类:



[java] view plaincopyprint?
public enum RetentionPolicy{
SOURCE, // 编译器处理完Annotation后不存储在class中
CLASS, // 编译器把Annotation存储在class中,这是默认值
RUNTIME // 编译器把Annotation存储在class中,可以由虚拟机读取,反射需要
}
public enum RetentionPolicy{ SOURCE, // 编译器处理完Annotation后不存储在class中 CLASS, // 编译器把Annotation存储在class中,这是默认值 RUNTIME // 编译器把Annotation存储在class中,可以由虚拟机读取,反射需要 }
实例:



[java] view plaincopyprint?
importjava.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String hello() default "Hello";
String world();
}
@MyAnnotation(world = "World")
class MyAnnotationTest {
public static void main(String[]args) {
if (MyAnnotationTest.class.isAnnotationPresent(
MyAnnotation.class)) {
MyAnnotation annotation =MyAnnotationTest.class
.getAnnotation(MyAnnotation.class);
Stringhello=annotation.hello();
Stringworld=annotation.world();
System.out.println(hello);
System.out.println(world);
}
}
}
importjava.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation { String hello() default "Hello"; String world(); } @MyAnnotation(world = "World") class MyAnnotationTest { public static void main(String[]args) { if (MyAnnotationTest.class.isAnnotationPresent( MyAnnotation.class)) { MyAnnotation annotation =MyAnnotationTest.class .getAnnotation(MyAnnotation.class); Stringhello=annotation.hello(); Stringworld=annotation.world(); System.out.println(hello); System.out.println(world); } } }
3. 定义注解时可以用@Target修饰,它表示此定义的这个注解可修饰哪些元素(如类、方法、字段、局部变量、包等),@Target注解的属性值是一个ElementType枚举类型,它的源码如下:



[java] view plaincopyprint?
public enum ElementType {
TYPE,
FIELD,
METHOD,
PARAMETER,
CONSTRUCTOR,
LOCAL_VARIABLE,
ANNOTATION_TYPE,
PACKAGE
}
public enum ElementType { TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE, ANNOTATION_TYPE, PACKAGE }

四、注意事项:
1.所有的Annotation自动继承java.lang.annotation接口

2.自定义注释的成员变量访问类型只能是public、default;(所有的都能访问,源作者没用到函数:getDeclaredFields而已)

3.成员变量的只能使用基本类型(byte、short、int、char、long、double、float、boolean和String、Enum、Class、annotations以及该类型的数据)

4.如果只有一个成员变量,最好将参数名称设为value,赋值时不用制定名称而直接赋值

5.在实际应用中,还可以使用注释读取和设置Bean中的变量。

评分

参与人数 1技术分 +2 收起 理由
黄文伯 + 2 25分!撒花撒花!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马