java基础第二十四天——注解和枚举以及Scheam

Posted 名字真的很急用

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java基础第二十四天——注解和枚举以及Scheam相关的知识,希望对你有一定的参考价值。

一:Scheam

  • 定义Schema .xsd
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3school.com.cn"
xmlns="http://www.w3school.com.cn"
elementFormDefault="qualified">

<xs:element name="note">
    <xs:complexType>
      <xs:sequence>
	<xs:element name="to" type="xs:string"/>
	<xs:element name="from" type="xs:string"/>
	<xs:element name="heading" type="xs:string"/>
	<xs:element name="body" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
</xs:element>

此文件包含对 XML Schema 的引用:

<?xml version="1.0"?>
<note
xmlns="http://www.w3school.com.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3school.com.cn note.xsd">

<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>

代码解释:

下面的片断:

xmlns:xs="http://www.w3.org/2001/XMLSchema"

显示 schema 中用到的元素和数据类型来自命名空间 “http://www.w3.org/2001/XMLSchema”。同时它还规定了来自命名空间 “http://www.w3.org/2001/XMLSchema” 的元素和数据类型应该使用前缀 xs:

这个片断:

targetNamespace="http://www.w3school.com.cn" 

显示被此 schema 定义的元素 (note, to, from, heading, body) 来自命名空间: “http://www.w3school.com.cn”。

这个片断:

xmlns="http://www.w3school.com.cn" 

指出默认的命名空间是 “http://www.w3school.com.cn”。

这个片断:

elementFormDefault="qualified" 

指出任何 XML 实例文档所使用的且在此 schema 中声明过的元素必须被命名空间限定。

最常用的类型是:

•xs:string
•xs:decimal
•xs:integer
•xs:boolean
•xs:date
•xs:time

如何声明属性?

定义属性的语法是:

<xs:attribute name="xxx" type="yyy"/>

可选的和必需的属性

在缺省的情况下,属性是可选的。如需规定属性为必选,请使用 “use” 属性:

<xs:attribute name="lang" type="xs:string" use="required"/>

二:枚举

  • 开发中,一些固定值用常量存储

    • 书写麻烦
    • 不能对其进行其他操作
  • 为了间接的表示一些固定的值,Java就提供了枚举。

    • 将固定的数据,一一列举出来
  • 定义枚举

    • public enum Year{
      	枚举项一,枚举项二,...}
      
  • 特点

    • 1:所有的枚举都是Enum的子类
      2:我们可以通过"枚举类名.枚举项名称"去访问指定的枚举项(枚举项,也是数据)
      3:每一个枚举项,都是枚举的一个对象
      4:枚举本质也是一个类,也可以去定义成员变量
      5:枚举中第一行必须是枚举项,最后一个枚举项;是可以省略的。但是建议不要省略
      6:枚举类可以有构造器,但是修饰符必须是private,默认也是private
      7:枚举类可以有抽象方法,但是枚举项必须要重写该方法
      
    • 常用

      • String name()  :获取枚举项名称
        int ordinal(): 获取枚举项的索引值
        int compareTo(E o) :用来比较两个枚举项;返回的是索引值的差值
        String toString() :返回对象的内部信息(是否重写toString)
        valueOf(Class<T> enumType, String name) :获取指定枚举类中的指定枚举名称的枚举值
        values():获得所有的枚举项
        
public enum week {

    Mon,Tue,Wed,Thu,Fri,Sat,Sun;

    public static void main(String[] args) {

        //创建枚举数组
        week[] days=new week[]{week.Mon,week.Tue,week.Wed,week.Thu};
        //得到一个枚举对象
        week fri = week.Fri;
        week sun = week.Sun;
        String name = fri.name();

        System.out.println(fri.ordinal());

        int i = fri.compareTo(sun);
        System.out.println(i);

        week[] values = week.values();
        for (int j = 0; j <values.length ; j++) {
            System.out.println(values[j]);
        }

        week thu = week.valueOf("Thu");
        System.out.println(thu);
    }
}

三:注解

  • @
    • 对我们的程序进行标注和解释
  • 注释
    • 注释是给人看
    • 注解是给编译器
  • 优点
    • 更加简洁,方便

四:自定义注解

  • 格式

    • public @interface 注解名称
      
      
  • 变量的格式

    • public 属性类型 属性名() default 默认值
        /*
        
          * 基本数据类型
          * String
          * Class
          * 注解
          * 枚举类型
          * 一维数组+以上类型
        
        */
      
import 枚举.week;

public class demo1 {

    public static void main(String[] args) {

    }
}
//自定义注解
//public @interface 注解名称{}
//不能有方法
//可以有成员变量  格式:Public 属性类型 属性名() default 默认值
//属性类型:String class 枚举 一维数组 注解
 @interface A{

    public int age();
    public String a() default "521959";
    public Class b() default  demo1.class;
    public M c() default @M;
    public week d() default week.Mon;
    public int[] e() default {1,2,3};
}
  • 元注解

    • 元注解就是描述注解的注解

    • @Target() :指定注解在哪使用
      @Retention(RetentionPolicy.SOURCE):指定该注解存活时间(编译时,运行时)
      @Inherited :表示修饰的自定义注解可以被子类继承
      
import java.lang.annotation.*;

//@Target(ElementType.METHOD)//元注解 指定注解在哪里使用

//@Retention(RetentionPolicy.CLASS)// 存活时期在什么状态  SOURCE 源码, CLASS 编译, RUNTIME 运行

@Inherited //表示修饰的自定义注解可以被子类继承

@Retention(RetentionPolicy.RUNTIME)
public @interface M {

}

注解的生命周期
注解的生命周期有三种,注解驻留在源文件阶段,字节码文件阶段和内存字节码阶段。

(1)注解被保留到源文件阶段

当javac把.java源文件编译成.class时,就将相应的注解去掉。这种注解的生命周期就维持到源文件阶段。

(2)注解被保留到字节码文件阶段

在JVM通过ClassLoader向内存中加载字节码文件时候,JVM会去掉相应的注解。这种注解的生命周期就维持到字节码文件阶段。

注意:生命周期到源文件阶段和字节码文件阶段的注解,由于JVM执行内存中的字节码时候,相应的注解已经被Javac或者JVM去除,所以无法使用反射来访问相应的注解。

(3)注解被保留到内存中的字节码阶段

JVM运行内存的字节码时候,仍然可能会保留并且执行的某些注解。这种注解的生命周期就维持到内存字节码阶段。

注意:这个阶段,程序可以通过反射访问生命周期到内存字节码阶段的注解。
isAnnotationPresent(M.class) 判断这个方法是否在运行时状态 存在注解 boolean类型 
import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

@M
public class demo2 {

    public static void main(String[] args) throws Exception {

        demo2 d = new demo2();
        Class<?> c = d.getClass();
        Constructor<?> constructor = c.getConstructor();
        //System.out.println(constructor);
        demo2 o = (demo2) constructor.newInstance();
        Method[] declaredMethods = c.getDeclaredMethods();
        for(Method s:declaredMethods){
            if(s.isAnnotationPresent(M.class)){
                s.invoke(o);
                System.out.println(o);

            }
        }
    }




    public  static  void  method1(){}
    public  static  void  method2(){}
    @M
    public  static  void  method3(){
        System.out.println(222);
    }
    public  static  void  method4(){}

    public demo2(){}

}
@Inherited //表示修饰的自定义注解可以被子类继承
import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;

public class demo3 extends demo2 {
    public static void main(String[] args) throws ClassNotFoundException {
        //Class<?> aClass = Class.forName("注解.demo3");
        demo3 d = new demo3();
        Class<? extends demo3> aClass = d.getClass();
        boolean annotationPresent = aClass.isAnnotationPresent(M.class);
        System.out.println(annotationPresent);
    }
}

最后是简单的junit测试,需要我们导包"junit-4.7.jar",方便我们进行测试

package junit;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class demo_junit {
    @Test
    public  void a(){
        System.out.println(1111);
    }
    @Before
    public  void b(){
        System.out.println(2222);
    }
    @After
    public  void c(){
        System.out.println(3333);
    }
}

以上是关于java基础第二十四天——注解和枚举以及Scheam的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin基础(十四) 枚举类(enum)数据类(data)和密封类(sealed)与java的写法差异

java语言基础--枚举,注解,正则和反射

大数据必学Java基础(八十四):注解的案例介绍

韩顺平循序渐进学Java零基础 第11章 枚举和注解

Java基础第二十四天总结——集合

Java基础——枚举与注解