注解+枚举

注解+枚举

一、枚举

  1. 枚举定义?

    枚举:enumeration 关键字enum,表示一些程序中的固定值,是Java5.0之后提出的类型。

    枚举就是把程序中固定的值列举出来。

  2. 创建枚举?
    //和类对照着看
    //枚举本身不是类,但是我们可以看作是一个类来使用
    class A{
          
          }
    
    //枚举最大得特征就是属性全部大写
    enum A{
          
          
        RED,YELLOW,GREEN;
    }
    
  3. 枚举的使用?
    1. 枚举传入switch case中

      	@Test
          public void testEnum(){
              
              
              System.out.println(Color.RED);
              Color c = Color.RED;
              switch (c){
              
              
                  case GREEN:
                      System.out.println("绿灯");break;
                  case RED:
                      System.out.println("红灯");break;
                  case YELLOW:
                      System.out.println("黄灯");break;
              }
              System.out.println(Color.valueOf("RED")==Color.RED);
              System.out.println(Color.values()[0]+"\t"+Color.values()[1]+"\t"+Color.values()[2]);
              Color.RED.show();
          }
          
      
    2. valueOf(“”):把字符串转换对应的枚举类型

    3. values()[0]:把枚举的值搞成数组的形式,并且返回第一位上的

    4. 枚举是列举所有可能性,外部不能再new了,因为枚举的构造方法是private修饰的

    5. 枚举中的属性,类型是枚举本身 修饰符public static final

    6. 另外枚举的toString()方法重写了,直接打印枚举属性 得到的是字符串

  4. 枚举的应用?
    1. 框架一样,只是个别属性不一样的,可以封装成枚举的样子

      package com.etoak.enums;
      
      public enum Teacher {
              
              
          WL("二爷","易途COREJAVA讲师","人气颇高的美女讲师,授课严谨细致、脉络清晰,讲解声情并茂,善于拓展延伸,亲和力强,对待教学认真负责,要求严格,循循善诱,平易近人,不厌其烦,细心讲解,经验丰富,深入浅出,逻辑性强,善于总结归纳重点和难点。负责Java核心技术的教学,是无数易途学员的启蒙老师")
          ,
          QP("薄老师","DB","四年开发经验,曾在胜利油田项目中负责数据库迁移,并在中国移动旗下咪咕阅读参与数据库方案设计,数据实时推送,还在建筑,金融,电商,智能警务等多个行业积累了Oracle丰富的实战经验,并将整个课程都与现实工作紧密结合起来,负责Oracle数据库教学。");
          private String name;
          private String title;
          private String info;
      
          Teacher(String name, String title, String info) {
              
              
              this.name = name;
              this.title = title;
              this.info = info;
          }
      
          public String getName() {
              
              
              return name;
          }
      
          public String getTitle() {
              
              
              return title;
          }
      
          public String getInfo() {
              
              
              return info;
          }
      }
      
    2. 还可以用在组装响应内容上

      /*
      响应返回的样子
      * {
      *   code:200 50900
      *   msg:"",
      *   data:{}
      *
      * class ETResponse{
      *   int code;
      *   String msg;
      *   Object data;
      *   setter/getter
      * }
      
      
      定义枚举 列举出所有可能性
      * enum  ETStatus{
      *       SUCCESS(200,"invoke success"),FAIL(300,"invoke fail"),
      *       SERVER_ERROR(500,"server error");
      *         int code;
      *       String msg;
      *   private ETStatus(int code,String msg){
      *   this.code = code;
      *   this.msg = msg;
      *
      *   }
      *       getter..
      *}
      
      
      * StudentController{
      *   public ETResponse queryAllSchs(){
      *       List<School> schs = n....
              ETResponse response = new ETResponse();
              response.setCode(SUCCESS/FAIL/ERROR/..)200
              resposne.setCode(ETStatus.SUCCESS.getCode())
              response.setMsg()
              response.setData(变化);
      *  }
      * }
      * }
      

二、注解

  1. 注解简介?
    1. 注解 Annotation 创建时使用的关键字 @interface
    2. 一般写在:类上、属性上、方法上、参数上
    3. 注解包括:注解类型本身和响应的处理程序
  2. 目前见过的注解?
    1. Mybatis

      @Parm:出来方法参数中 给组装的map设置key的名字

      @Alias:给类起别名

    2. Servlet

      @WebServlet:热部署

      @WebFIlter:过滤器

      @WebListener:监听器

    3. Spring

      1. 创建对象的:

        @Component、@Controller、@Service、@Repository

      2. 给属性赋值的:

        @Autowired + @Qulifier @Resource @Value

      3. @Configration @ConponentScan

      4. @RequstMapping(拦截请求)、@ResponseBody(把响应内容组装成json格式)

    4. Junit

      @Test:单元测试的

  3. 来自Java.lang.annotation包下的注解

    以下几个注解是给注解使用的,加载注解上面的

    1. @Target:表示注解可以用在哪些程序元素上
        //这里就是枚举
        value=ElementType.METHOD  方法
        	 =ElementType.FIELD  属性
        	 =ElementType.TYPE  其他类、接口
             =ElementType.PARAMETER  参数
    
    2. @Retention:注解的保留策略
        	一般注解写在源码中 编译之后保存到class文件中,但是运行期间,JVM加载类时,会把注解信息擦除
        value=RetentionPolicy.SOURCE  保存在源码中(.java文件)
        	 =RetetnionPolicy.CLASS   class文件 默认的
        	 =RetentionPolicy.RUNTIME   运行时加载
        
    3. @Document:是否把注解信息生成到API文档中
        
    4. @Override:重写注解,此注解的保留策略必然是SOURCE
        因为它只是在编译时检查是否完成重写,编译之后不需要存在了
    
    
  4. 自定义注解?
    public @interface Etoak{
          
          
        //注解中的属性  default给默认值
        Stirng value() default "";
    }
    
    //使用时
    1. value属性
        @Etoak("haha") 此处就是给value属性赋值 
        value可以省略:如果注解属性名字是value,则在使用注解给value赋值时 可以省略value
    
    2. 注解中可以放枚举
        RequestMethod.GET:枚举,表示可以接收什么请求 可以是个数组 表示接收多个请求
        @RequstMapping(value="query",method={
          
          RequestMethod.GET,RequestMethod.POST})
            
    3. 注解中可以放注解
            
        @WebServlet(value="/stu",name="xxx",
            initParams ={
          
          @WebInitParam(name="ContextConfigLocation",
            value="/WEB-INF/applicationContext.xml")} )
        
            
            initParams属性,放置的servlet初始化参数
            
            相当于:
    <servlet>
        <servlet-name>xxx</servlet-name>
        <servlet-class>Test</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/applicationContext.xml</param-value>
        </init-param>
    </servlet>
            
     <servlet-mapping>
        <servlet-name>xxx</servlet-name>
        <url-pattern>/stu</url-pattern>
    </servlet-mapping> 
    
  5. 手写Junit测试类

    Junit单元测试的原理:

    当我们在在某个方法上加上@Test时 会触发一个main方法 也就是说@Test注解中包含了一个main方法

    步骤:

    1. 首先要先获得当前类的Class对象 .class

    2. 然后 获得这个Class对象的所有方法 cls.getDeclaredMethods()

    3. 获得所有方法上的注解 getDeclaredAnnotations

      需要用到关于注解的注解 就是上述来自java.lang.annotation包中的注解

      加上@Retention(RUNTIME) 把保留策略设置成在运行期

    4. 去判断注解是不是自定义的注解,如果时就调用invoke(new XXX())即可

      这里的new XXX() 表示创建带有main方法的对象

     public static void main(String[] args) throws Exception{
          
          
            //main
            Class cls = Test.class;
            Annotation [] ans = cls.getDeclaredAnnotations();
            for(Annotation an:ans){
          
          
                if(an.annotationType()==Etoak.class){
          
          
                    //1.created
                    Object obj = cls.newInstance();
                    //2.init
                    Method[] ms = cls.getDeclaredMethods();
                    for(Method m:ms){
          
          
                        Annotation[] as = m.getDeclaredAnnotations();
                        for(Annotation a:as){
          
          
                            if(a.annotationType() ==PostConstruct.class){
          
          
                                m.invoke(obj);
                            }
                            //doSth..
                            if(a.annotationType()==PreDestroy.class){
          
          
                                m.invoke(obj);
                            }
                        }
                    }
                }
            }
    

猜你喜欢

转载自blog.csdn.net/G7581/article/details/115018767