黑马程序员_Java注解学习笔记
2014-07-17 14:58
567 查看
---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------
注解使得我们能够以将由编译器来测试和验证的格式,存储有关程序的额外信息。
注解语法:@+关键字
(1)@Override,表示当前的方法定义将覆盖超类中的方法。如果不小心拼写错误,或者方法签名对不上被覆盖的方法,编译器就会发出错误提示。
(2)@Deprecated,如果程序员使用了注解为该元素,那么编译器会发出警告信息。
(3)@SuppressWarnings,关闭不当的编译器警告信息。
Java SE5内置了四种元注解,定义在java.lang.annotation中的注解:
@Target,用来定义你的注解将应用于什么地方(方法、域)
@Retention,表示需要在什么级别保存改注解信息,
级别包括:源代码(SOURCE,注解将被编译器丢弃)、类文件(CLASS,注解在class文件中可用,但会被VM丢弃)或者运行时(RUNTIME,VM将在运行期也保留注解,因此可以通过反射机制读取注解的信息)。
@Documented,将此注解包含在Javadoc中。
@Inherited,允许子类继承父类中的注解。
注意:在Java SE5之前的版本中,也可以使用该注解,不过会被忽略不起作用。被注解的方法与其他的方法没有区别。注解(annotation)是在实际的源代码级别保存所有的信息,而不是某种注释性的文字(comment),这使得代码更整洁且便于维护。
自定义一个注解UseCase
在实际开发中使用注解UseCase
UseCase注解对应的注解处理器
所有基本类型,string,Class,enum,Annotation,前面类型的数组。如果你使用了其他类型,那么编译器就会报错。
(2) 对于非基本类型的元素,无论是在源代码中声明时,或是在注解接口中定义默认值时,都不能以null作为其值。
为了解决上述约束,我们只能自定义一些特殊的值,例如空字符或负数,以此表示某个元素不存在,样例:
然后直接在需要了得类中使用该注解即可
---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------
详细请查看:<a href="http://www.itheima.com" target="blank">www.itheima.com</a>
一、Java注解概述
1.定义
注解,也被称作元数据,为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便地使用这些数据。注解使得我们能够以将由编译器来测试和验证的格式,存储有关程序的额外信息。
注解语法:@+关键字
2.Java自带的注解
Java SE5内置了三种标准注解,定义在java.lang中的注解:(1)@Override,表示当前的方法定义将覆盖超类中的方法。如果不小心拼写错误,或者方法签名对不上被覆盖的方法,编译器就会发出错误提示。
(2)@Deprecated,如果程序员使用了注解为该元素,那么编译器会发出警告信息。
(3)@SuppressWarnings,关闭不当的编译器警告信息。
Java SE5内置了四种元注解,定义在java.lang.annotation中的注解:
@Target,用来定义你的注解将应用于什么地方(方法、域)
@Retention,表示需要在什么级别保存改注解信息,
级别包括:源代码(SOURCE,注解将被编译器丢弃)、类文件(CLASS,注解在class文件中可用,但会被VM丢弃)或者运行时(RUNTIME,VM将在运行期也保留注解,因此可以通过反射机制读取注解的信息)。
@Documented,将此注解包含在Javadoc中。
@Inherited,允许子类继承父类中的注解。
注意:在Java SE5之前的版本中,也可以使用该注解,不过会被忽略不起作用。被注解的方法与其他的方法没有区别。注解(annotation)是在实际的源代码级别保存所有的信息,而不是某种注释性的文字(comment),这使得代码更整洁且便于维护。
二、自定义一个注解
在注解中,一般都会包含一些元素以表示某些值。没有元素的注解称为标记注解。注解的元素在使用时表现为名-值对的形式,并需要置于@关键字声明之后的括号内。大多数时候,程序员主要是定义自己的注解,并编写自己的处理器来处理它们。使用注解的过程中,很重要的一个部分就是创建与使用注解处理器。样例代码:自定义一个注解UseCase
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 注解接口定义 */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface UseCase { public int id();//注解元素,类似接口中定义的方法 public String description() default "no description"; }
在实际开发中使用注解UseCase
import java.util.List; /** * 使用自定义的注解UseCase */ public class PasswordUtils { /* * UseCase注解设置元素id,description的值 */ @UseCase(id=47,description="Passwords must contain at least one numeric") public boolean validatePaaword(String password){ return (password.matches("\\w\\d\\w*")); } @UseCase(id=48) public String encryptPassword(String password){ return new StringBuilder(password).reverse().toString(); } @UseCase(id=49,description="New passwords can't equal previously used ones") public boolean checkForNewPassword(List<String> prevPasswords,String password){ return !prevPasswords.contains(password); } }
UseCase注解对应的注解处理器
import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * 注解处理器,UseCase */ public class UseCaseTracker { public static void trackUseCases(List<Integer> useCases,Class<?> cl){ for(Method m:cl.getDeclaredMethods()){ UseCase uc=m.getAnnotation(UseCase.class); if(uc!=null){ System.out.println("Found Use Case:"+uc.id()+" "+uc.description()); useCases.remove(new Integer(uc.id())); } } for(int i:useCases){ System.out.println("Warning:Missing use case-"+i); } } public static void main(String[] args) { List<Integer> useCases=new ArrayList<Integer>(); Collections.addAll(useCases, 47,48,49,50); trackUseCases(useCases,PasswordUtils.class); } }
三、注解元素可用的类型
所有基本类型,string,Class,enum,Annotation,前面类型的数组。如果你使用了其他类型,那么编译器就会报错。四、默认值限制规定
(1) 元素不能有不确定的值。也就是说,元素必须要么具有默认值,要么在使用注解时提供元素的值。(2) 对于非基本类型的元素,无论是在源代码中声明时,或是在注解接口中定义默认值时,都不能以null作为其值。
为了解决上述约束,我们只能自定义一些特殊的值,例如空字符或负数,以此表示某个元素不存在,样例:
public @interface SimulatingNull { public int id() default -1;//负数 public String description() default " ";//空值 }
然后直接在需要了得类中使用该注解即可
---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------
详细请查看:<a href="http://www.itheima.com" target="blank">www.itheima.com</a>
相关文章推荐
- 黑马程序员 java学习笔记——注解
- 【黑马程序员】 学习笔记 - Java新技术 - 注解
- 黑马程序员-java学习笔记-注解
- 黑马程序员——学习笔记18.Java注解
- 黑马程序员_java基础加强学习笔记之注解
- 黑马程序员_JAVA注解学习笔记
- 黑马程序员java学习笔记之三(java集合框架类)
- 黑马程序员学习笔记之七(Java IO操作)
- 黑马程序员 java学习笔记2-IO流
- 黑马程序员_Java高新技术部分学习笔记
- 黑马程序员学习笔记之六(java网络编程)
- 黑马程序员_学习笔记6注解的总结
- 黑马程序员-javaIO学习笔记
- 黑马程序员J_ava学习笔记_Java中的基本数据类型转换详解
- 黑马程序员_毕向东_Java基础视频教程第十八天-IO流---学习笔记
- 黑马程序员---java TCP 学习笔记
- 黑马程序员学习笔记之五(java中的泛型)
- 黑马程序员——Java异常处理学习笔记
- 黑马程序员---- Java学习笔记:1.异常 2.集合
- 黑马程序员 java学习笔记4-Io流学习后可能会用到的实例