`
啸笑天
  • 浏览: 3466171 次
  • 性别: Icon_minigender_1
  • 来自: China
社区版块
存档分类
最新评论

33了解和入门注解的应用34 注解的定义与反射调用35为注解增加各种属性

阅读更多

 

33  了解和入门注解的应用

l  先通过@SuppressWarnings的应用让大家认识和了解一下注解:

Ø  通过System.runFinalizersOnExit(true);的编译警告引出@SuppressWarnings("deprecation")

l  @Deprecated

Ø  直接在刚才的类中增加一个方法,并加上@Deprecated标注,在另外一个类中调用这个方法。

l  @Override

Ø  public boolean equals(Reflect other)方法与HashSet结合讲解

l  总结:

Ø 注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事。标记可以加在包,类,字段,方法,方法的参数以及局部变量上

Ø java.lang包,可看到JDK中提供的最基本的annotation

 

34 注解的定义与反射调用

 

注解就相当于一个你的源程序中要调用的一个类,要在源程序中应用某个注解,得先准备好了这个注解类。就像你要调用某个类,得先有开发好这个类。


 
自定义注解及其应用:
l 定义一个最简单的注解:public @interface MyAnnotation {}
l 把它加在某个类上:@MyAnnotation public class AnnotationTest{}
l 用反射进行测试AnnotationTest的定义上是否有@MyAnnotation 
l 根据发射测试的问题,引出@Retention元注解的讲解,其三种取值:RetetionPolicy.SOURCERetetionPolicy.CLASSRetetionPolicy.RUNTIME;分别对应:java源文件-->class文件-->内存中的字节码。

注解的默认值是在class阶段。

@Override是给javac看的,编译完就没有价值了,也就说只有在源代码中有用,所以属性值是@Retention(value=SOURCE)

@SuppressWarnings的属性值是@Retention(value=SOURCE)

@Deprecated的属性值是@Retention(value=RUNTIME)

PSclass文件中的东西不是字节码,只有经过一系列的检查后加载到内存中才是字节码。

l  演示和讲解@Target元注解 
Ø  Target的默认值为任何元素,设置Target等于ElementType.METHOD,原来加在类上的注解就报错了,改为用数组方式设置{ElementType.METHOD,ElementType.TYPE}就可以了。 
l  <!--[endif]-->元注解以及其枚举属性值不用记,只要会看jdk提供那几个基本注解的API帮助文档的定义或其源代码,按图索骥即可查到,或者直接看java.lang.annotation包下面的类。

package cn.zyj35.review;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface ItcastAnnotation {
 
}

 

 

 

package cn.zyj35.review;
@ItcastAnnotation()
public class AnnotationTest {
   @SuppressWarnings("deprecation")
   public static void main(String[] args) {
     
      System.runFinalizersOnExit(true);
            //用反射进行测试的代码:
//检查返回的注解对象的类名,发现它其实是一个代理。
      if(AnnotationTest.class.isAnnotationPresent(ItcastAnnotation.class)){
         ItcastAnnotation annotation = (ItcastAnnotation)AnnotationTest.class.getAnnotation(ItcastAnnotation.class);
         System.out.println(annotation);
      }
 
   }
   @Deprecated
   public static void sayHello(){
      System.out.println("hi,传智播客");
   }
}
 

 

 


35为注解增加各种属性
为注解增加基本属性:

l  什么是注解的属性

Ø  一个注解相当于一个胸牌,如果你胸前贴了胸牌,就是传智播客的学生,否则,就不是。如果还想区分出是传智播客哪个班的学生,这时候可以为胸牌在增加一个属性来进行区分。加了属性的标记效果为:@MyAnnotation(color="red")

l  定义基本类型的属性和应用属性:

Ø  在注解类中增加String color();

Ø  @MyAnnotation(color="red")

l  用反射方式获得注解对应的实例对象后,再通过该对象调用属性对应的方法

Ø  MyAnnotation a = (MyAnnotation)AnnotationTest.class.getAnnotation(MyAnnotation.class);

Ø  System.out.println(a.color());

Ø  可以认为上面这个@MyAnnotationMyAnnotaion类的一个实例对象

l  为属性指定缺省值:

Ø  String color() default "yellow";

l  value属性:

Ø  String value() default "zxx";

Ø  如果注解中有一个名称为value的属性,且你只想设置value属性(即其他属性都采用默认值或者你只有一个value属性),那么可以省略value=部分,例如:@MyAnnotation("lhm")

 

为注解增加高级属性:

l  数组类型的属性

Ø  int [] arrayAttr() default {1,2,3};

Ø  @MyAnnotation(arrayAttr={2,3,4})

Ø  如果数组属性中只有一个元素,这时候属性值部分可以省略大括

l  枚举类型的属性

Ø  EnumTest.TrafficLamp lamp() ;

Ø  @MyAnnotation(lamp=EnumTest.TrafficLamp.GREEN)

l  注解类型的属性:

Ø  MetaAnnotation annotationAttr() default @MetaAnnotation("xxxx");

Ø  @MyAnnotation(annotationAttr=@MetaAnnotation(“yyy”) )

Ø  可以认为上面这个@MyAnnotationMyAnnotaion类的一个实例对象,同样的道理,可以认为上面这个@MetaAnnotationMetaAnnotation类的一个实例对象,调用代码如下:

       MetaAnnotation ma =  myAnnotation.annotationAttr();

       System.out.println(ma.value());

l  注解的详细语法可以通过看java语言规范了解,即看javalanguage specification

 

Ps

注解的属性可以是八个,基本数据类型,String类型,Class类型,enum类型,annotation类型,和前面所有的数组类型。

Ps

枚举和注解都是特殊的类,不能用new 创建它们的实例对象,创建枚举的实例对象就是在其中增加元素。

在程序中如何创建出一个注解的实例对象啊?直接用@放上一个标记即可

MetaAnnotation注解的定义:

public @interface MetaAnnotation {

   String value();

}

 

例子:

package cn.zyj35.review;
 
public enum TrafficLamp {
    //内部类。如果枚举元素后面没有大括号对,那是不会生成内部类的。
   RED(30){
      public  TrafficLamp nextLamp(){
         return GREEN;
      }
   },
   GREEN(45){
      public  TrafficLamp nextLamp(){
         return YELLOW;
      }       
   },
   YELLOW(5){
      public  TrafficLamp nextLamp(){
         return RED;
      }       
   };
   public abstract TrafficLamp nextLamp();
   private int time;
   private TrafficLamp(){}
   private TrafficLamp(int time){this.time = time;}
   public String toString(){
      if (this==RED) {
         return "红";
      } else if(this==GREEN){
         return "绿";
      }else{
         return "黄";
      }
   }
}

 

 

 

package cn.zyj35.review;
public @interface MetaAnnotation {
   String value();
}

 

 

 

package cn.zyj35.review;
 
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface ItcastAnnotation {
   int num() default 1;
   String color() default "blue";
   String value();
   int[] arrayAttr() default {3,4,4};
   TrafficLamp lamp() default TrafficLamp.RED;
   MetaAnnotation annotationAttr() default @MetaAnnotation("lhm");
   Class strClass() default String.class;
 
}

 

 

package cn.zyj35.review;
 
import java.lang.reflect.Method;
 
@ItcastAnnotation(annotationAttr=@MetaAnnotation("flx"),color="red",value="abc",arrayAttr=1)
public class AnnotationTest {
   @SuppressWarnings("deprecation")
   @ItcastAnnotation("方法注解")
   public static void main(String[] args) throws  Exception {
     
      System.runFinalizersOnExit(true);
      //用反射进行测试的代码:
      //检查返回的注解对象的类名,发现它其实是一个代理。
      if(AnnotationTest.class.isAnnotationPresent(ItcastAnnotation.class)){
         ItcastAnnotation annotation = (ItcastAnnotation)AnnotationTest.class.getAnnotation(ItcastAnnotation.class);
         System.out.println(annotation);
         System.out.println(annotation.num());
         System.out.println(annotation.color());
         System.out.println(annotation.value());
         System.out.println(annotation.arrayAttr().length);//int[]是Object,不是Object[]
         System.out.println(annotation.lamp().nextLamp().name());
         System.out.println(annotation.annotationAttr().value());
         System.out.println(annotation.strClass().toString());
      }
     
      Method mainMethod = AnnotationTest.class.getMethod("main", String[].class);
      ItcastAnnotation annotation2 = (ItcastAnnotation)mainMethod.getAnnotation(ItcastAnnotation.class);
      System.out.println(annotation2.value());
   }
 
   @Deprecated
   public static void sayHello(){
      System.out.println("hi,china");
   }
}
 
 

 

 

 

 


  • 大小: 21.5 KB
分享到:
评论

相关推荐

    了解和入门注解的应用

    在编程世界中,注解(Annotation)是一种元数据,它为编译器、JVM(Java虚拟机)或工具提供信息,以优化程序的编写、分析和执行过程。本篇文章将深入探讨注解的基本概念、类型以及它们在实际开发中的应用。 首先,...

    java 通过反射获取类上注解,方法上注解,注解里的值及方法参数

    1. **注解的定义与使用** 注解以`@`符号开头,后面跟着注解的类型。例如,`@Override`表示方法重写,`@Deprecated`表示某个功能已过时。注解可以应用于类、接口、字段、方法等。注解本身不直接影响程序的执行,但...

    servlet反射注解例子

    本文将详细探讨反射和注解在Servlet中的应用。 首先,让我们来了解一下什么是反射。反射是Java编程语言的一种特性,它允许运行中的程序检查和操作类、接口、方法和字段等对象。通过反射,我们可以在运行时动态地...

    Java基础入门四泛型反射注解.pdf

    Java作为云计算环境下编写应用和服务的主要语言之一,其泛型、反射和注解等高级特性为构建云计算平台上的应用提供了便利,从而满足不断变化的业务需求。 学习Java编程,特别是泛型、反射和注解这些高级特性,对于想...

    Android-注解与反射注解知识点反射知识点注解java反射

    在`AnnotationDemo-master`这个项目中,可能包含了注解和反射的实践案例,例如通过注解定义接口规范,然后在运行时通过反射动态调用相应的实现类。这样的设计模式在Android组件化、插件化开发中十分常见,能够提高...

    java注解和反射的12个demo.zip

    在Java中,注解(Annotation)是一种元数据,它提供了将信息附加到代码(类、方法、变量等)的方式,而反射则允许我们在运行时检查类、接口、字段和方法的属性,并能动态调用方法或访问字段。 注解的作用主要有以下...

    使用反射和注解模拟Spring的依赖注入

    在Java编程中,Spring...总的来说,理解和掌握反射与注解对于深入学习Spring框架至关重要。通过模拟Spring的依赖注入,开发者可以更好地领悟到IoC和DI的核心思想,从而在实际开发中更有效地利用Spring框架提供的功能。

    注解和反射机制的学习笔记

    例如,Lombok库使用注解处理器在编译时自动添加getter、setter、equals、hashCode和toString方法,而MyBatis框架允许开发者通过注解定义SQL语句,这些语句在运行时通过反射被解析并执行。 总的来说,注解和反射是...

    java基础知识学习教程-12注解和反射.pptx

    涵盖了注解的基本概念、内置注解、元注解和自定义注解等知识点,并引入反射机制,详细介绍了反射的概念、Class类、通过反射获取注解、通过反射创建对象、通过反射调用方法和属性等知识点。 1. 注解的基本概念 Java...

    Spring 注解 入门

    在本文中,我们将深入探讨如何使用Spring注解进行属性注入,并重点关注`@Autowired`和`@Qualifier`这两个关键注解。 1. **使用`@Autowired`注解** 在传统的Spring配置中,我们需要在XML配置文件中手动定义bean及其...

    java注解、java反射机制 jdbc 封装

    Java注解和反射机制是Java开发中的重要工具,它们极大地增强了代码的可读性和灵活性。在结合JDBC(Java Database Connectivity)API时,可以构建出更高效、更易维护的数据访问层。本案例通过注解的方式,简化了JDBC...

    Java反射、泛型和注解实战之Spring核心注入IOC的实现

    在Java编程领域,反射、泛型和注解是三个非常重要的特性,它们为代码提供了高度的灵活性和可扩展性。在本实战项目中,我们将深入探讨如何利用这些特性实现一个类似Spring框架的核心注入机制,即控制反转(Inversion ...

    仿Litepal 注解和反射实现的数据框架

    首先,让我们了解注解(Annotation)和反射(Reflection)的基本概念。注解是Java提供的一种元编程机制,它允许在源代码中嵌入一些元数据,这些元数据可以被编译器或运行时环境解析并执行相应的处理。反射则是Java...

    《利用反射技术处理自定义注解》的设计与实现 AnnotationPrj.7z

    反射(Reflection)是Java的一个强大特性,允许程序在运行时检查类、接口、字段和方法的信息,甚至能够动态调用方法和修改对象状态。《利用反射技术处理自定义注解》的设计与实现,旨在探讨如何结合这两种机制以实现...

    Spring java注解,元注解和自定义注解

    ### Spring Java注解、元注解与自定义注解详解 #### 一、Java注解简介 在深入了解Spring框架中的注解应用之前,我们首先需要对Java注解有一个基本的认识。Java注解(Annotation)是一种元数据,可以为程序代码添加...

    android 反射注解框架

    在Android开发中,注解(Annotation)和...通过深入理解和运用注解与反射,开发者可以进一步优化代码结构,提高应用程序的质量。在实际项目中,类似的框架可以作为一个基础工具库,方便快速开发新功能,降低维护成本。

    spring中自定义注解(annotation)与AOP中获取注解

    要创建一个自定义注解,我们需要定义一个注解类型,并指定它的属性。例如: ```java @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MyCustomAnnotation { String value() ...

    JAVA设计模式--程序设计--反射--注解--泛型

    通过反射,我们可以动态地创建对象、调用方法、访问和修改私有属性,实现动态加载类,以及进行元数据分析等。反射的应用场景广泛,如插件系统、框架设计、单元测试等。 注解(Annotation)是Java中的元数据,它为...

    反射操作注解与反射操作泛型.docx

    本文将详细介绍反射操作和泛型在 Java 编程中的应用,特别是结合注解(Annotation)和对象关系映射(ORM)的使用。 一、反射操作 反射操作是 Java 语言中的一种机制,允许程序在运行时检查和修改类、对象、方法、...

    自定义注解实现伪动态传参的小demo

    自定义注解是扩展Java功能的强大工具,可以用于实现各种目的,如代码生成、编译时检查、运行时处理等。在这个“自定义注解实现伪动态传参的小demo”中,我们将探讨如何创建一个自定义注解,以允许在注解中传递类似于...

Global site tag (gtag.js) - Google Analytics