当前位置: 首页 > news >正文

网站做301排名会掉微信公众号的开发

网站做301排名会掉,微信公众号的开发,亚马逊跨境电商app,网络营销渠道策略分析前言 这篇内容主要掌握的就是logback使用、理解类加载器、XML文件的编写#xff0c;XML文档约束schema#xff0c;用Dom4j解析XML文档#xff0c;Xpath检索XML文档#xff0c;完整使用Junit单元测试框架常用部分#xff0c;注解的定义和使用#xff0c;枚举类的定义和开发… 前言 这篇内容主要掌握的就是logback使用、理解类加载器、XML文件的编写XML文档约束schema用Dom4j解析XML文档Xpath检索XML文档完整使用Junit单元测试框架常用部分注解的定义和使用枚举类的定义和开发应用。 一、log日志 log日志类似输出语句可以用来输出程序的信息但是log日志更加好用。 1.输出语句的弊端 2. log日志的优点 可以将系统执行的信息选择性的记录到指定的位置控制台、文件中、数据库中。 可以随时以开关的形式控制是否记录日志无需修改源代码。 日志技术的具体优势 3.日志框架体系 日志框架需要日志规范的要求实现日志规范大多是一些接口提供给实现框架去设计的。常见的规范有Commons Logging、SimpleLoggingFacadeforJava。 志的实现框架有Log4J、Logback我们重点学习的其他的都大同小异 4.日志框架LogBack  (1)概述 Logback是基于slf4j的日志规范实现的框架性能比之前使用的log4j要好。 官方网站Logback Home Logback主要分为三个技术模块  logback-core:该模块为其他两个模块提供基础代码必须有。  logback-classic完整实现了slf4j APl的模块。  logback-access模块与Tomcat和Jetty等Servlet容器集成以提供HTTP访问日志功能 (2)配置 1.创建一个maven项目在pom文件将下面的依赖坐标导入项目 dependencygroupIdch.qos.logback/groupIdartifactIdlogback-classic/artifactIdversion1.2.3/version/dependency  刷新maven自动导入下面三个jar包 2. 将Logback的核心配置文件logback.xml直接拷贝到maven项目的resources目录下 logback.xml内容如下 ?xml version1.0 encodingUTF-8? configuration!--CONSOLE 表示当前的日志信息是可以输出到控制台的。--appender nameCONSOLE classch.qos.logback.core.ConsoleAppender!--输出流对象 默认 System.out 改为 System.err--targetSystem.out/targetencoder!--格式化输出%d表示日期%thread表示线程名%-5level级别从左显示5个字符宽度%msg日志消息%n是换行符--pattern%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %c [%thread] : %msg%n/pattern/encoder/appender!-- File是输出的方向通向文件的 --appender nameFILE classch.qos.logback.core.rolling.RollingFileAppenderencoderpattern%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n/patterncharsetutf-8/charset/encoder!--日志输出路径--fileC:/code/itpzh-data.log/file!--指定日志文件拆分和压缩规则--rollingPolicyclassch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy!--通过指定压缩文件名称来确定分割文件方式--fileNamePatternC:/code/itpzh-data2-%d{yyyy-MMdd}.log%i.gz/fileNamePattern!--文件拆分大小--maxFileSize1MB/maxFileSize/rollingPolicy/appender!--level:用来设置打印级别大小写无关TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF 默认debugroot可以包含零个或多个appender-ref元素标识这个输出位置将会被本日志级别控制。--root levelinfoappender-ref refCONSOLE/appender-ref refFILE //root /configuration (3)入门程序 A.步骤 1.获取日志的对象。 private final static Logger LOGGER LoggerFactory.getLogger(类对象); 注意这个对象要全局共享唯一static final修饰            这个Logger一定要是org.slf4j.Logger这个第三方包下的 2.用日志对象的方法记录系统的日志信息。 B.入门实例代码 import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Scanner;public class LoggerDemo1 {//获取一个共享的唯一的log日志对象private final static Logger LOGGER LoggerFactory.getLogger(LoggerDemo1.class);public static void main(String[] args) {//获取用户登录的日志Scanner sr new Scanner(System.in);while (true) {System.out.println(请输入用户名);String username sr.next();System.out.println(请输入密码);String password sr.next();if (张三.equals(username) 12345.equals(password)) {LOGGER.info(用户{}登录成功密码为{}, username, password);break;} else {LOGGER.info(用户{}登录失败, username);}}} } 运行完LOGGER.info的内容不仅显示在控制台而且还被保存到文件里面 因为配置文件appender标签内容有配置后面会说  (4)配置文件logback.xml解说 Logback日志系统的特性都是通过核心配置文件logback.xml控制的。 Loaback日志输出位置、格式设置 1.通过logback.xml中的appender标签可以设置输出位置和日志信息的详细格式。 2.通常可以设置2个日志输出位置一个是控制台、一个是系统文件中 下面的appender标签内的各种标签解说 appender标签的属性nameCONSOLE时表示输出到控制台 class表示输出到控制台的功能由ch.qos.logback.core.ConsoleAppender这个类来实现 target标签表示System.out以标准输出流的形式输出到控制台上面 encoder和pattern标签规定输出内容的格式%d{yyyy-MM-dd HH:mm:ss.SSS}表示按格式输出年月日 时分秒        [%-5level]表留五个空格的长度输出日志的等级        %c表示当前操作的类 %thread表示当前所在的线程比如main线程     %msg表示输出的信息 下面讲解root标签内的属性和附属标签 root标签控制哪几个appender标签能否生效的里面用appender-ref/标签标记要生效的appender标签。 root标签的属性level用来设置打印级别一共7个All表示root标签所包含的appender-ref/标签全部生效OFF表示全部不生效。 (5)日志级别 作用 如果系统上线后只想记录一些错误的日志信息或者不想记录日志了怎么办 可以通过设置日志的输出级别来控制哪些日志信息输出或者不输出。 解说日志级别是可以通过日志对象的.level方法去设置的不设置的话默认是继承日志的顶级父类 root的级别debug。 当root标签的level属性设置为WARN时日志对象如果日志级别为TRACE,DEBUG,INFO就不输出日志。 二、类加载器 1.作用 负责将.class文件存储的物理文件加载在到内存中 2.类加载的完整过程 1类加载时机 简单理解字节码文件什么时候会被加载到内存中 有以下的几种情况 创建类的实例对象 调用类的类方法 访问类或者接口的类变量或者为该类变量赋值 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象 初始化某个类的子类 直接使用java.exe命令来运行某个主类 总结而言用到了就加载不用不加载 2类加载过程   类加载分为5个阶段 加载验证准备解析初始化。 其中验证准备解析归为链接阶段 加载 就是将字节码文件通过IO流读取到JVM的方法区并同时在堆中生成Class对象。 通过包名 类名获取这个类准备用流进行传输 在这个类加载到内存中 加载完毕创建一个class对象 注意创建的class对象的变量类型如果是引用类型就用符号代替 链接  A.验证 确保Class文件字节流中包含的信息符合当前虚拟机的要求并且不会危害虚拟机自身安全 (文件中的信息是否符合虚拟机规范有没有安全隐患) B.准备 负责为类的类变量被static修饰的变量分配内存并设置默认初始化值 (初始化静态变量) C.解析 将类的二进制数据流中的符号引用替换为直接引用 (本类中如果用到了其他类此时就需要找到对应的类) 这里的符号引用意思是在类加载的时候将一个类的字节码文件以二进制数据流输入JVM该类的成员变量的类型如果是像String类型这种引用类型但是在加载的时候String从哪里来那里去都不知道于是先用符号代替String这就是符号引用 初始化 根据程序员通过程序制定的主观计划去初始化类变量和其他资源 (静态变量赋值以及初始化其他资源) 3.类加载器分类 1分类 Bootstrap class loader虚拟机的内置类加载器通常表示为null 并且没有父级类加载器 Platform class loader平台类加载器,负责加载JDK中一些特殊的模块 System class loader系统类加载器,负责加载用户类路径上所指定的类库 自定义类加载器 2类加载器的继承关系逻辑上的继承看后面的双亲委派模型 自定义加载器的父加载器为System System的父加载器为Platform Platform的父加载器为Bootstrap 3代码演示证明 public class ClassLoaderDemo1 {public static void main(String[] args) {//获取系统类加载器ClassLoader systemClassLoader ClassLoader.getSystemClassLoader();//获取系统类加载器的父加载器 --- 平台类加载器ClassLoader classLoader1 systemClassLoader.getParent();//获取平台类加载器的父加载器 --- 启动类加载器ClassLoader classLoader2 classLoader1.getParent();System.out.println(系统类加载器 systemClassLoader);System.out.println(平台类加载器 classLoader1);System.out.println(启动类加载器 classLoader2);} }  运行结果 4. 双亲委派模型 如果一个类加载器收到了类加载请求它并不会自己先去加载而是把这个请求委托给父类的加载器去执行如果父类加载器还存在其父类加载器则进一步向上委托依次递归请求最终将到达顶层的启动类加载器如果父类加载器可以完成类加载任务就成功返回倘若父类加载器无法完成此加载任务子加载器才会尝试自己去加载这就是双亲委派模式 5.ClassLoader 中的两个方法 方法名说明public static ClassLoader getSystemClassLoader()获取系统类加载器public InputStream getResourceAsStream(String name)加载某一个资源文件 实例代码 public class ClassLoaderDemo2 {public static void main(String[] args) throws IOException {//获取系统类加载器ClassLoader systemClassLoader ClassLoader.getSystemClassLoader();//利用加载器去加载一个指定的文件//参数文件的路径放在maven项目的resources目录下默认去那里加载//返回值字节流。InputStream is systemClassLoader.getResourceAsStream(prop.properties);Properties properties new Properties();properties.load(is);System.out.println(properties);is.close();} } 三、XML 1.配置文件 XML文件一般作为配置文件使用那么什么是配置文件 配置文件就是用来保存程序在运行时需要的一些参数。比如说idea的配置文件当我们第一次使用idea的时候我们配置idea的主题字体大小等等这些参数会被保存在idea的配置文件里面当我们再次打开idea的时候idea会从配置文件中加载这些参数就不用我们重新配置idea主题什么的了。 常见的配置文件有什么 有.txt文件有.properties文件有.xml文件 三种配置文件的优缺点 txt文件只记录参数的值太初略 properties文件以键值对的形式记录参数较为详细 但是对于复杂的多用户的配置文件就不适应选择使用xml文件 TXT文件没有优点缺点是不利于阅读 properties文件优点就是键值对形式易于阅读缺点就是无法配置一组一组的数据。 XML文件优点是易于阅读可以配置成组出现的数据 以后配置文件怎么选择 数据量较少一个键只对应一个值使用properties 数据量较多使用xml 2.XML概述 XML的全称为(EXtensible Markup Language)是一种可扩展的标记语言标记语言: 通过标签来描述数据的一门语言(标签有时我们也将其称之为元素)可扩展标签的名字是可以自定义的,XML文件是由很多标签组成的,而标签名是可以自定义的 作用 用于进行存储数据和传输数据 作为软件的配置文件 作为配置文件的优势 可读性好 可维护性高 3.XML的基本语法 1XML文件的命名和位置 XML文件要放在src目录下或者放在maven项目下面的resources目录下面 2标签元素规则  3XML其他组成  4示例 4.XML文档约束 1什么是文档约束 于是需要文档约束来用来限定xml文件中的标签以及属性应该怎么写。以此强制约束程序员必须按照文档约束的规定来编写xml文件。 2约束分类 DTD schema 3DTD约束 DTD约束编写 A.步骤 创建一个文件这个文件的后缀名为.dtd 看xml文件中使用了哪些元素 !ELEMENT 可以定义元素 判断元素是简单元素还是复杂元素 简单元素没有子元素。复杂元素有子元素的元素 简单元素修饰词 ​ EMPTY: 表示标签体为空 ​ ANY: 表示标签体可以为空也可以不为空 ​ PCDATA: 表示该元素的内容部分为字符串 复杂元素修饰词​                                                                                                                   直接写子元素名称. 多个子元素可以使用,或者|隔开​ ,表示定义子元素的顺序 ; |: 表示子元素只能出现任意一个​ ?零次或一次, 一次或多次, *零次或多次;如果不写则表示出现一次 元素的属性的定义 格式 定义一个属性的格式为!ATTLIST 元素名称 属性名称 属性的类型 属性的约束属性的类型​ CDATA类型普通的字符串 属性的约束: ​ // #REQUIRED 必须的​ // #IMPLIED 属性不是必需的​ // #FIXED value属性值是固定的 B.代码 简单入门 !ELEMENT persons (person) !ELEMENT person (name,age) !ELEMENT name (#PCDATA) !ELEMENT age (#PCDATA)  复杂 !ELEMENT persons (person) !ELEMENT person (name,age) !ELEMENT name (#PCDATA) !ELEMENT age (#PCDATA) !ATTLIST person id CDATA #REQUIRED DTD约束引入 三种引入方式 简单入门代码 // 这是persondtd.dtd文件中的内容,已经提前写好 !ELEMENT persons (person) !ELEMENT person (name,age) !ELEMENT name (#PCDATA) !ELEMENT age (#PCDATA)// 在person1.xml文件中引入persondtd.dtd约束 ?xml version1.0 encodingUTF-8 ? !DOCTYPE persons SYSTEM persondtd.dtdpersonspersonname张三/nameage23/age/person/persons 复杂代码  //dtd代码 !ELEMENT persons (person) !ELEMENT person (name,age) !ELEMENT name (#PCDATA) !ELEMENT age (#PCDATA) !ATTLIST person id CDATA #REQUIRED//xml代码 ?xml version1.0 encodingUTF-8 ? !DOCTYPE persons SYSTEM persondtd.dtdpersonsperson id001name张三/nameage23/age/personperson id 002name张三/nameage23/age/person/persons 4schema约束 schema和dtd的区别 schema约束文件也是一个xml文件符合xml的语法这个文件的后缀名.xsd 一个xml中可以引用多个schema约束文件多个schema使用名称空间区分名称空间类似于java包名 dtd里面元素类型的取值比较单一常见的是PCDATA类型但是在schema里面可以支持很多个数据类型 schema 语法更加的复杂 schema约束编写 A.步骤  1创建一个文件这个文件的后缀名为.xsd。 2定义文档声明跟xml文件第一行一样 3schema文件的根标签为 schema 4在schema中定义属性​ xmlnshttp://www.w3.org/2001/XMLSchema 5在schema中定义属性 ​ targetNamespace 唯一的url地址指定当前这个schema文件的名称空间。 6在schema中定义属性 ​ elementFormDefaultqualified“表示当前schema文件是一个质量良好的文件。直接复制用就行 7通过element定义元素 8判断当前元素是简单元素还是复杂元素 代码 ?xml version1.0 encodingUTF-8 ? schema xmlnshttp://www.w3.org/2001/XMLSchematargetNamespacehttp://www.example.org/belementFormDefaultqualifiedelement namepersonscomplexTypesequence maxOccursunboundedelement namepersoncomplexTypesequenceelement namename typestring/element nameage typeint//sequence/complexType/element/sequence/complexType/element /schema schema约束引入 直接在xml文件的第二行先输入idea会弹出提示框选择目标的xsd 选择后idea直接导入约束 入门代码 //xsd代码 ?xml version1.0 encodingUTF-8 ? schema xmlnshttp://www.w3.org/2001/XMLSchematargetNamespacehttp://www.example.org/belementFormDefaultqualifiedelement namepersonscomplexTypesequence maxOccursunboundedelement namepersoncomplexTypesequenceelement namename typestring/element nameage typeint//sequence/complexType/element/sequence/complexType/element /schema//xml代码 ?xml version1.0 encodingUTF-8 ? persons xmlnshttp://www.example.org/bpersonname张三/nameage18/age/personpersonname张三/nameage18/age/personpersonname张三/nameage18/age/person /persons 5.XML文件解析 XML的数据的作用是什么最终需要怎么处理 存储数据、做配置信息、进行数据传输  最终需要被程序进行读取解析里面的信息。 有几种解析方式 SAX一般不用和DOM SAX和DOM的优缺点 SAX不会把整体的xml文件都加载到内存而是从上往下逐行进行扫描。 缺点只能读取不能添加不能删除。 优点因为他是逐行扫描不需要把整体的xml文件都加载到内存所以他可以解析比较大的xml文件。 DOM会把整体的xml文件都加载到内存。 会把这个整天在内存中形成一个树形结构我们可以通过这个树形结构去解析xml文件。 优点可以读取可以添加可以删除可以做任何事情。 缺点需要xml文件全部加载到内存所以不能解析非常大的xml文件。 1Dom解析的文档对象模型一层一层解析的过程 2Dom常见的解析工具 6.Dom4j解析XML 1快速入门 public class Dom4jDemo1 {public static void main(String[] args) throws DocumentException {//1.创建解析器对象SAXReader saxReader new SAXReader();//2.利用解析器去读取XML文件并返回文件对象File file new File(src\\main\\resources\\a.xml);Document document saxReader.read(file);//拿到了document表示我已经拿到了xml文件的整体//3.打印System.out.println(document);//下面一层一层的扒开获取里面的内容即可} } 2成员方法 Element类 3最终示例 需求         将下面的XML文件的几个人的信息保存到内存中 建议创建一个Person类来存储人物信息 ?xml version1.0 encodingUTF-8 ? personsperson id1name张三/nameage18/age/personperson id2name李四/nameage20/age/personperson id3name张三/nameage21/age/person /persons 创建一个Person类 public class Person {private int id;private String name;private int age;public Person(int id, String name, int age) {this.id id;this.name name;this.age age;}Overridepublic String toString() {return Person{ id id , name name \ , age age };} } 正文代码 public class Dom4jDemo2 {public static void main(String[] args) throws DocumentException {//1.创建解析器对象SAXReader saxReader new SAXReader();//2.利用解析器去读取XML文件并返回文件对象File file new File(src\\main\\resources\\a.xml);Document document saxReader.read(file);//拿到了document表示我已经拿到了xml文件的整体//创建一个集合来存储人物的信息ArrayListPerson list new ArrayList();//下面一层一层的扒开获取里面的内容即可//获取根元素Element rootElement document.getRootElement();//获取根元素下的所有person元素ListElement elements rootElement.elements(person);for (Element element : elements) {//获取子元素的id属性Attribute id element.attribute(id);String idValue id.getValue();//获取子元素的name和ageString nameValue element.element(name).getText();String ageValue element.element(age).getText();Person person new Person(Integer.parseInt(idValue), nameValue, Integer.parseInt(ageValue));list.add(person);}list.stream().forEach(System.out::println);} } 7.XML检索技术Xpath 如果需要从XML文件中检索需要的某个信息如name怎么解决 Dom4j需要进行文件的全部解析然后再寻找数据。 Xpath技术更加适合做信息检索。 XPath在解析XML文档方面提供了一独树一帜的路径思想更加优雅高效。 XPath使用路径表达式来定位XML文档中的元素节点或属性节点 /元素/子元素/孙元素 //子元素//孙元素 1使用步骤 1.导入jar包(dom4j和jaxen-1.1.2.jar)Xpath技术依赖Dom4j技术 2.通过dom4j的SAXReader解析器获取Document对象 3.利用XPath提供的API,结合XPath的语法完成选取XML文档元素节点进行解析操作。 4.Document中与Xpath相关的API如下 2路径表达式 绝对路径 相对路径  全文搜索 属性查找 3快速入门 需求         利用Xpath检索技术解析XML中的name元素XML文件内容如下 ?xml version1.0 encodingUTF-8 ? personsperson id1name张三/nameage18/age/personperson id2name李四/nameage20/age/personperson id3name王五/nameage21/age/personname基尼太妹/name /persons 代码 public class XpathDemo {public static void main(String[] args) throws DocumentException {//1.获取解析器SAXReader saxReader new SAXReader();//2.用解析器解析XML文件获得对于的Document对象File file new File(src/main/resources/a.xml);Document document saxReader.read(file);//3.通过Xpath的API获取name元素//1绝对路径ListElement list1 document.selectNodes(/persons/person/name);System.out.println(绝对路径获取name内容一共list1.size()个);for (Element element : list1) {System.out.println(element.getText());}//2相对路径Element rootElement document.getRootElement();ListElement list2 rootElement.selectNodes(./person/name);System.out.println(相对路径获取name内容一共list2.size()个);for (Element element : list2) {System.out.println(element.getText());}//3全文搜索ListElement list3 document.selectNodes(//name);System.out.println(全文搜索获取name内容一共list3.size()个);for (Element element : list3) {System.out.println(element.getText());}//4属性搜索Element node (Element) document.selectSingleNode(//person[id1]/name);System.out.println(属性搜索获取name内容node.getText());} } 四、单元测试 1.什么是单元测试为什么用它 单元测试就是针对最小的功能单元编写测试代码Java程序最小的功能单元是方法因此单元测试就是针对Java方法的测试进而检查方法的正确性。 以前测试方法只有一个main方法如果一个方法的测试失败了其他方法测试会受到影响。还需要程序员自己去观察测试是否成功。 2.Junit单元测试框架 1简述 JUnit是使用Java语言实现的单元测试框架它是开源的Java开发者都应当学习并使用JUnit编写单元测试。 此外几乎所有的IDE工具都集成了JUnit这样我们就可以直接在IDE中编写并运行JUnit测试JUnit目前最新版本是5。 2优点 1.JUnit可以灵活的选择执行哪些测试方法可以一键执行全部测试方法。 2.单元测试中的某个方法测试失败了不会影响其他测试方法的测试。 3.运行成功是绿色运行失败是红色 3步骤 4快速入门 测试代码 public class JunitDemo1 {Test//输入注解Test//如果爆红就按alt回车//选择Junit4导入public void method1() {System.out.println(2/0);int a 100;int b 100;System.out.println(ab);}Testpublic void method2() {int a 100;int b 100;System.out.println(ab);}Testpublic void method3() {int a 100;int b 100;System.out.println(ab);} } 测试结果 5Junit常用注解 一般实际开发常用的就前面的3个注解Before,Test,After这三个注释配套使用 实际开发的测试原则就是保证测试前后的数据原原本本不变 于是完整的单元测试步骤 1.先执行的Before的方法对数据进行一个初始化的动作和数据的备份 2.再执行Test的方法,去真正的去测试方法要配合断言与期望数据做对比 3.最后执行After的方法去还原数据 Junit中一般的断言使用方法 参数1如果断言为假就将message的信息输出到控制台                         为真就不输出 参数2期望得到的结果 参数3运行完测试方法得到的实际结果 Assert.assertEquals(message,expected, actual); 6完整的单元测试 以后在实际开发中如果想要测试一个方法是否正确并不是直接在当前方法的上面写Test的 而是自己独立编写一个测试类。不要写main方法 在这个类中编写一些方法。 在方法里面调用要被测试的方法即可 需求         测试File类中的delete方法是否书写正确 代码 独立写一个测试类创建要测试的方法所在类的对象File,运行FIle对象的delete方法 测试方法必须数据备份和恢复 public class JunitDemo2 {Beforepublic void method1() throws IOException {//数据备份FileInputStream fis new FileInputStream(logs\\a.txt);FileOutputStream fos new FileOutputStream(logs\\copy.txt);int b;while ((bfis.read())!-1){fos.write(b);}fos.close();fis.close();}Testpublic void method2(){//测试File类的delete方法File file new File(logs\\a.txt);//判断是否删除成功boolean delete file.delete();//检查a.txt是否存在boolean exists file.exists();Assert.assertEquals(delete方法出错了,true,delete);Assert.assertEquals(delete方法出错了,false,exists);}Afterpublic void method3() throws IOException {//数据恢复FileInputStream fis new FileInputStream(logs\\copy.txt);FileOutputStream fos new FileOutputStream(logs\\a.txt);int b;while ((bfis.read())!-1){fos.write(b);}fos.close();fis.close();new File(logs\\copy.txt).delete();} }五、注解 1.简述 Annotation表示注解。是JDK1.5的新特性。 注解的主要作用对我们的程序进行标注。通过注解可以给类增加额外的信息。 注解是给编译器或JVM看的编译器或JVM可以根据注解来完成对应的功能。 注释是给人看的编译阶段会注释擦除 2.常见的注解掌握  Override表示方法的重写 Deprecated表示修饰的方法已过时 SuppressWarnings(all): 压制警告 除此之外还需要掌握第三方框架中提供的注解 比如Junit Test表示运行测试方法 Before表示在Test之前运行进行数据的初始化 After表示在Test之后运行进行数据的还原 3.自定义注解 1定义格式 类似类的定义 2使用格式 注解名(属性名1值1属性名2值2) 注意         注解使用可以放在类方法和属性的上面         使用自定义注解时要保证注解每个属性都有值         注解可以使用默认值 没有默认值的一定要赋值 创建一个注解 public interface MyAnno1 {String name();int age() default 18; } 使用  MyAnno1(name 张三) public class Test {MyAnno1(name 王五,age 20)int age;MyAnno1(name 李四)public void method1(){System.out.println(method1);} } 3特殊属性value value属性如果只有一个value属性的情况下使用value属性的时候可以省略value名称不写 但是如果有多个属性且多个属性没有默认值那么vaue名称是不能省略的。 常见的SuppressWarnings(all):就是只有一个value属性的注解 4.元注解 元注解就是注解的注解就是写在注解上面的注解 比如下面   1两个元注解 Target约束自定义注解只能在哪些地方使用  Retention:申明注解的生命周期 Target  Target中可使用的值定义在ElementType枚举类底层写好的中常用值如下 TYPE类接口 FIELD成员变量 METHOD成员方法 PARAMETER方法参数 CONSTRUCTOR构造器 LOCAL_VARIABLE局部变量 Retention Retention中可使用的值定义在RetentionPolicy枚举类中常用值如下 SOURCE注解只作用在源码阶段生成的字节码文件中不存在 CLASS注解作用在源码阶段字节码文件阶段运行阶段不存在默认值 RUNTIME注解作用在源码阶段字节码文件阶段运行阶段开发常用 5.注解解析 1概念和作用 注解的操作中经常需要进行解析注解的解析就是判断是否存在注解存在注解就解析出内容。 举一个例子Junit框架中的Test注解是怎么将测试方法运行起来的这其中就是用到了注解解析。  当运行测试方法的时候Test注解就会通过反射来获取对应方法的Method类然后执行方法。 2与注解解析相关的接口和方法 Annotation注解的顶级接口 可以利用反射解析注解 有的类成分ClassMethodFieldConstructor都实现了AnnotatedElement接口他们都拥有解析注解的能力 3 解析注解的技巧 注解在哪个成分上我们就先拿哪个成分对象。 比如注解作用成员方法则要获得该成员方法对应的Methed对象再来拿上面的注解 比如注解作用在类上则要该类的class对象再来拿上面的注解 比如注解作用在成员变量上则要获得该成员变量对应的Field对象再来拿上面的注解 配合后面的 模拟Junit框架理解 6.模拟Junit框架 需求         定义若干个方法只要加了MyTest注解就可以在启动时被触发执行 分析         定义一个自定义注解MvTest只能注解方法存活范围是一直都在。         定义若干个方法只要有MyTest注解的方法就能在启动时被触发执行没有这个注解的方法不能执行。 代码  Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) public interface MyTest { }public class MyTestMethod {MyTestpublic void method1(){System.out.println(method1);}public void method2(){System.out.println(method2);}MyTestpublic void method3(){System.out.println(method3);} }public class MyTestDemo {public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, InvocationTargetException {//1,获取class对象Class clazz Class.forName(com.itheima.test2.MyTestMethod);//获取对象Object o clazz.newInstance();//2.获取所有方法Method[] methods clazz.getDeclaredMethods();for (Method method : methods) {//method依次表示类里面的每一个方法method.setAccessible(true);//判断当前方法有没有MyTest注解if(method.isAnnotationPresent(MyTest.class)){method.invoke(o);}}} } 运行结果  method1 method3 六、枚举类  1.概念使用和优缺点 可以查看【Java】枚举类型_java 枚举类-CSDN博客 2.主要的应用开发场景 状态管理 使用枚举类表示对象的不同状态例如订单状态待支付、已支付、已发货、已完成等。 错误代码 定义各种错误类型或错误代码以提高代码的可读性和可维护性。 配置选项 使用枚举类来封装常见的配置选项例如日志级别DEBUG、INFO、WARN、ERROR或环境开发、测试、生产。 类型安全的选择 替代字符串常量提供类型安全的选项避免因拼写错误导致的问题例如选择用户角色ADMIN、USER、GUEST。 策略模式 在实现策略模式时可以使用枚举类来封装策略的实现从而使代码更清晰。 分类系统 在需要分类的场景中例如商品类别电子产品、服饰、食品等枚举类可以提供一种清晰的结构。 API 设计 在 API 中使用枚举类可以清晰地表示可选参数使接口更加易于理解和使用。 事件类型 用于定义不同的事件类型例如用户操作事件点击、提交、查看等。 数据库映射 将数据库中的状态值映射到应用程序中的枚举类简化数据操作。 网络协议 定义网络协议中的操作类型或消息类型以提高代码的可读性。 枚举类通过提供一组固定的常量值能够使代码更清晰更易于维护和扩展。
http://www.tj-hxxt.cn/news/225988.html

相关文章:

  • 网站做支付宝支付接口建设工程人员锁定网站
  • 网站宣传的手段有哪些?(写出五种以上)wordpress根据id排序
  • 什么网站可以做实验室dedecms 做网站
  • 做网站用什么后台团队管理的七个要点
  • 好看的手机网站推荐外贸网站后台
  • 大创意网站html制作电影网站
  • 毕业设计做旅游网站网站建设预期周期
  • 个人 建设图片分享网站网络服务提供商有哪些
  • 英文网站建设60软件开发和网站建设那个好
  • 在线制作表白网站常德网站建
  • 个人介绍微电影网站模板dw做网站首页怎么做
  • 网站备案的公司注销了网站论坛模板
  • asp网站开发工具神器个人简介ppt免费模板
  • 网站建设专业英文tomcat 建网站
  • 江苏丹阳建设公司网站咸阳哪里做网站
  • 龙采网站建设资源分享平台成都p2p网站建设
  • 0592 网站建设成全视频免费观看在线看古装电视剧
  • 中国核工业第五建设公司网站建设交易网站多少钱
  • 做商城网站怎么做开发一个小程序大概要多少钱
  • 魔方网站导航设计html5手机网页模板
  • 网站建设经费预算表和各大网站做视频的工作总结
  • 河北人工智能建站系统软件营销目标分为三个方面
  • 关键词网站网站禁ping
  • 重庆网站建设近重庆零臻科技哪里有创建网站的
  • 网站建设维护合同范本网站建设工作总结
  • 平面设计手绘网站网络营销推广seo
  • 石家庄网站建设雨点牛网站建设设计制作培训
  • flash做企业网站宣传片史志网站建设方案
  • 中国建设银行网站慢wordpress网站上传到服务器
  • 东莞建网站平台网站设计制作平台哪个好