首页 > 编程 > Java > 正文

java注解学习笔记

2019-11-08 02:58:12
字体:
来源:转载
供稿:网友

java注解的重要性/学习目的:

1.能看别人的代码,特别是框架代码,因为肯定与注解有关。

2.让代码简洁明了,代码清晰易懂。

java注解是java1.5引入的:注解概念是java提供的一种原程序中的元素关联任何信息和元数据的途径和方法。 A:常见注解(编译时注解); @override:方法覆盖了它的父类的方法 @DePRecated:这个注释是一个标记注释。所谓标记注释,就是在源程序中加入这个标记后,并不影响程序的编译,但有时编译器会显示一些警告信息。或者在方法名上加一横线,意思是建议不使用 @SuppressWarnings(“”):对代码中变量或方法的警告提示,也是想告诉该方法存在潜在风险等。 B:注解分类 1.按照运行机制分类 源码注解:只在java源码中存在,编译成.class文件时就不存在了。 编译时注解:在源码和.class文件中存在。 运行时注解:在运行时起作用,甚至可以影响运行逻辑。 2.按照来源进行分类 a:JDK注解: b:第三方注解:例如springMvc中的@Autowired,@Service,@Controller,Mybatis中的@InsertProvider,@UpdateProvider,@Options。 c:元注解:对注解的注解。例子如下四种元注解. @Target({ ElementType.METHOD, ElementType.TYPE }) /@Targe指注解的作用域,包括METHOD方法声明,TYPE类接口,PARAMETER参数声明,PACKAGE包声明,LOCAL_VARIABLE局部变量声明,FIELD字段声明及CONSTRUCTOR构造方法声明/ @Retention(RetentionPolicy.RUNTIME) /@Retenion指生命周期:1,源码注解:注解只在源码中存在 ,编译成.class文件就不存在了。2,d:编译时注解:在源码和.class中都存在3,运行时注解:在运行阶段才会起作用的注解,甚至会影响运行逻辑的注解。/ @Inherited /@Inherited指允许子类继承/ @Documented/@Documented生成java doc时包含注解信息/ e:自己定义的注解:通常格式为@inferance+注解名 。如下举例说明:

定义了一个Discription注解

public @interface Description {/*注解中的成员类型是受限制的:合法的类(int double等)包括原始类型及String,Class,Annotation,Enumeration等* 如果注解只有一个成员,则成员名必须取名为value(),在使用注解时可以忽略成员名和赋值符号(=)* 注解类可以没有成员,没有成员的注解称为标识注解****/String desc();//注解中的成员(成员变量)以无参无异常方式声明String author();int age() default 18;//可以用default为成员指定一个默认值}

先说说注解是如何使用的 @Description(author = “child”, desc = “在Child上的类注解”) //使用注解:使用注解语法 :@<注解名>(成员名1=值1,成员名2=值2…..)多个成员用逗号分隔,根据@Target指定的使用范围(注解的作用域,包括METHOD方法声明,TYPE类接口,PARAMETER参数声明,PACKAGE包声明,LOCAL_VARIABLE局部变量声明,FIELD字段声明及CONSTRUCTOR构造方法声明)来使用。

下面是对注解进行操作的一个小例子

public class Child{@Description(author = "ldm", desc = "在Child的name()方法注解")public String name() {// TODO Auto-generated method stubreturn null;}@Description(author = "child", desc = "Child中number()方法注解")public String number() {return "100";}}public static void main(String[] args) {// 首先使用类加载器加载类try {Class c = Class.forName("com.ldm.test.Child");// 找到类上面的注解boolean isExist = c.isAnnotationPresent(Description.class);// 判断注解是否存在if (isExist) {// 拿到注解实例Description d = (Description) c.getAnnotation(Description.class);System.out.println(d.desc());}//找到方法上的注解Method[] ms=c.getMethods();for (Method m : ms) {boolean isMExist = m.isAnnotationPresent(Description.class);// 判断注解是否存在if(isMExist){// 拿到注解实例Description d = (Description) m.getAnnotation(Description.class);System.out.println(d.desc());}}/**********************************************///另外一种解析方法for (Method m : ms) {Annotation []as=m.getAnnotations();for (Annotation a : as) {if(a instanceof Description){Description d=(Description) a;System.out.println(d.desc());}}}}catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

控制台打印语句:

在Child上的类注解 在Child的name()方法注解 Child中number()方法注解 在Child的name()方法注解 Child中number()方法注解


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表