注解,xml,sax,dom4j

目录

练习

反射练习

注解

1.注解的作用:

2.如何使用注解:

3.注解的分类:

按照属性个数划分:

根据注解使用方法和用途:

1)、JDK内置系统注解

 2)、元注解

3)、自定义注解

xml

可扩展的标记语言

学习XML的重点:

Sax

使用SAX解析的步骤:

 Dom4j

步骤:


  • 练习

 *  加载类:
 *      1.创建对象 (new clone 序列化)
 *      2.调用类中静态内容的时候
 *  ...
 *      
 *      在加载类的时候回首先加载静态的内容
 *      注意:内容的常量如果能够直接计算出结果,就不会加载类

public class Test01 {
	public static void main(String[] args) {
//		System.out.println(A.NUM);//22
		System.out.println(B.NUM); //0   0
		B b=new  B();
		b.test();
	}
}

class A{
	public static final int NUM=15+7;
	static{
		System.out.println(NUM);
	}
}

class B{
	public static final int NUM=(int)Math.random()+1;
	static{
		System.out.println(NUM);
	}
	void test(){
		System.out.println(NUM);
	}
}
  • 反射练习

package com.ref;

import java.lang.reflect.Array;
import java.util.Arrays;

/*
 * 数组
 */
public class RefDemo02 {
	public static void main(String[] args) {
		//通过反射创建数组
		int[] b=(int[])Array.newInstance(Integer.TYPE, 8);
		System.out.println(Arrays.toString(b));
		//判断是否为一个数组
		Boolean flag=b.getClass().isArray();
		if(flag){
			//数组设置值
			Array.set(b, 0, 8);
		}
		//数组获取值
		System.out.println(Array.get(b, 0));
		//获取数组的长度
		System.out.println(Array.getLength(b));
	}
}

class Person{}
  • 注解

1.注解的作用:

    1)对程序的解释说明
    2)可以使用工具获取到类中的信息并作出相应的处理

2.如何使用注解:

@注解名  位置:根据不同的功能使用在不用的位置

3.注解的分类:

按照属性个数划分:

标记注解:没有属性  @Override
单值注解:一个属性  @SuppressWarnings
完整注解:多个属性

根据注解使用方法和用途:

1)、JDK内置系统注解

 a: Override 检查是否为重写方法
 b: Deprecated 过时  不推荐使用
 c: SuppressWarnings 抑制警告

 2)、元注解

 注解 注解用的注解
            1.@Target 决定注解的使用位置
                如果没有定义Target,默认可以使用在任意位置
            2.@Retention 决定注解的生命周期
                SOURSE   :     源代码中
                ClASS     :            编译期
                RUNTIME :     运行期
            3.@Documented:           可以存在于API文档中
            4.@Inherited :     注解可以被继承

package day17.reflection;

import java.util.ArrayList;
import java.util.List;

@SuppressWarnings("all")
public class AnnotationDemo03 extends Fu {
	@Deprecated
	static int b = 5;

	// @Override
	static void test() {
		System.out.println(b);
		List ls = new ArrayList();
	}

	@SuppressWarnings("all")
	public static void main(String[] args) {
		test();
		// @SuppressWarnings("all")
		List ls = new ArrayList();

		List ls2 = new ArrayList();
	}

}

class Fu {
	static void test() {

	}
}

3)、自定义注解

使用@interface 自定义注解
如果字段名字为value,可以直接赋值(仅仅只有一个属性可以直接赋值),如果只有一个字段推荐使用value命名
default 可以设置默认值
属性的数据类型,只能为基本数据类型,String,Annotation,Class,枚举类型或以上这些类型的数组
字段的修饰符只能为public 和 default
自定义的注解类都继承了java.lang.Annotation

package day17.reflection;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@MetaAnno(num=13)
public class AnnoDemo04 {
	
	String name;
	
//	@MetaAnno
	public static void main(String[] args) {
		
		int a=5;
	}
	
	void test(){
		
	}
//	@MetaAnno
	public AnnoDemo04() {
		// TODO Auto-generated constructor stub
	}
}

//自定义注解
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD,ElementType.CONSTRUCTOR,ElementType.PARAMETER})
//@Documented
@interface MetaAnno{
	//字段
	int num();
	String value() default "hehe";
}

class Demo extends AnnoDemo04{
	
}
  • xml

可扩展的标记语言

1.标记语言用<>定义标签
2.标签要成对书写
3.xml比html要更严格,严谨,必须按照要求书写
4.xml可以用来做配置,传输,存储,更重于数据.
5.xml标签可以自定义,是可扩展的标记语言
6.根节点只能有存在一个

<?xml version="1.0" encoding="UTF-8"?>
<!-- 标记语言的注释 -->

<persons>
	<person>
		<name>张三</name>
		<age>18</age>
		<gender>男</gender>
	</person>
	<student>
		<name>张二狗</name>
		<age>17</age>
		<gender>女</gender>
	</student>
	<person>
		<name>球球</name>
		<age>16</age>
		<gender>男</gender>
	</person>
</persons>

学习XML的重点:

掌握xml解析
了解约束

  • Sax

基于事件流
      优点:节省内存空间

使用SAX解析的步骤:

            1.获取sax解析器工厂
            2.获取解析器
            3.自定义处理器  继承一个defaultHandler
            4.开始解析

 

package day17.reflection;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class SaxDemo01 {
	public static void main(String[] args) throws Exception {
		//1.获取工厂
		SAXParserFactory saxParser=SAXParserFactory.newInstance();
		//2.获取sax解析器
		SAXParser parser=saxParser.newSAXParser();
		//3.定义处理器
		MyParser my=new MyParser();
		//开始解析
		parser.parse("src/day17/test/person.xml", my);
	}
}

//定义处理器
class MyParser extends DefaultHandler{
	//开始解析xml文档
	@Override
	public void startDocument() throws SAXException {
		System.out.println("始解析xml文档");
	}
	
	//开始解析标签
	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		System.out.println("开始解析标签");
	}
	
	//解析元素中的内容
	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
		System.out.println("解析元素中的内容");
	}
	
	//结束元素的解析
	@Override
	public void endElement(String uri, String localName, String qName) throws SAXException {
		System.out.println("结束元素的解析");
	}
	//结束文档的解析
	@Override
	public void endDocument() throws SAXException {
		System.out.println("结束文档的解析");
	}
	
}
  •  Dom4j

把整个文件一起加载到内存中,然后可以一切操作
     缺点:耗内存

步骤:

            1.获取一个SAXReader对象
            2.使用文件获取Document对象
            3.获取根节点
            4.遍历

package day17.reflection;

import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

/*
 * 步骤:
 * 	1.获取一个SAXreader对象
 * 	2.使用文件获取Document对象
 * 	3.获取根节点
 * 	4.解析
 */
public class Dom4jDemo01 {
	public static void main(String[] args) throws DocumentException, IOException {
		//获取Document对象
		Document doc=getDocu("src/day17/test/person.xml");
		//3.获取根节点
		Element root=doc.getRootElement();
		//获取迭代器编译
		for(Iterator<Element> it=root.elementIterator();it.hasNext();){
			Element element=it.next();
			List<Element> ls=element.elements();
			for(Element e:ls){
				System.out.println(e.getName()+"--->"+e.getData());
			}
		}
		
		write(doc);
		
	}
	
	public static void  write(Document dos) throws IOException{
		//1.选择流
		XMLWriter writer;
		//2.定义一个写出的格式
		OutputFormat format=OutputFormat.createPrettyPrint();
//		OutputFormat format=OutputFormat.createCompactFormat();
		//3.创建流
		writer=new XMLWriter(new FileWriter("src/haha.xml"),format);
		writer.write(dos);
		writer.flush();
		writer.close();
	}
	
	//获取Document对象
	public static Document getDocu(String str) throws DocumentException{
		//1.获取一个SAXreader对象
		SAXReader reader=new SAXReader();
		//2.使用文件获取Document对象
		Document doc=reader.read(str);
		return doc;
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值