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的主要内容,如果未能解决你的问题,请参考以下文章