反射和XML的小结

反射理解

反射:对于任意一个类型,可以获取其方法和属性的
任意一个对象,可以访问其方法和属性的能力Class类型
Class 类型
Field 属性/字段
Method 方法
001.PNG

用反射创建对象并调用对象的方法


	//大致了解 反射
	//根据字符串加载类型到运行环境中, 获取Person类型
	Class cls = Class.forName("com.rgh.test.entity.Person");
		
	//根据类型创建对象 ,无需import
	Object obj = cls.newInstance();  //Person p1 = new Person();
	System.out.println("0.."+ obj);
	
	Method md = cls.getMethod("setPname", String.class);
	System.out.println(md);
	md.invoke( obj , "李四");		// p1.setPname("李四");
	
	md = cls.getMethod("getPname");
	System.out.println("1..." + md.invoke(obj));//"1.." + p1.getPname()

获得用反射创建的对象的属性和方法

  1. 自己的 getDeclaredFields,getDeclaredMethods
  2. 自己和继承的public的 getFields,getMethods
  3. 自己的构造 getDeclaredConstructors
  4. 所有接口 getInterfaces
  5. 所有内部类 getDeclaredClasses


	//大致了解 反射
	//根据字符串加载类型到运行环境中, 获取Person类型
	Class cls = Class.forName("com.rgh.test.entity.Person");
		
	//该类型的属性
	Field[] attrs  = cls.getDeclaredFields();
	System.out.println("1..类型属性:自己的 Declared");
	for (Field f : attrs) {
		System.out.println(f);
	}
	
	System.out.println("2..类型属性:自己和继承的public而来的");
	Field[] attrs2 = cls.getFields();
	for (Field f : attrs2) {
		System.out.println(f);
	}		
	
	//该类型的方法
	System.out.println("3..类型方法:自己的 Declared");
	Method[] mthds = cls.getDeclaredMethods();
	for (Method m : mthds) {
		System.out.println(m);
	}
	System.out.println("4..类型方法:自己和继承的public而来的");
	Method[] mthds2 = cls.getMethods();
	for (Method m : mthds2) {
		System.out.println(m);
	}
	
	//该类型的构造方法
	System.out.println("3..类型构造器:自己的 Declared");
	Constructor[] tor= cls.getDeclaredConstructors();
	for (Constructor ct : tor) {
		System.out.println(ct);
	}
	
	System.out.println("3..类型构造器:全部的自己的");
	Constructor[] tor2= cls.getConstructors();
	for (Constructor ct : tor2) {
		System.out.println(ct);
	}
	
	//该类型的接口
	System.out.println("4..类型的接口");
	Class[] ints = cls.getInterfaces();
	for (Class c : ints) {
		System.out.println(c);
	}
	
	//该类型的内部类
	System.out.println("4..类型的内部类:Declared");
	Class[] css = cls.getDeclaredClasses();
	for (Class c : css) {
		System.out.println(c);
	}

反射获取指定方法并调用,获取属性

  1. 单个属性 getDeclaredField
  2. 单个方法 getDeclaredMethod(方法名,参数类型)
  3. 创建实例 cls.newInstance()
  4. 调用实例 Method.invoke(实例,参数值) 返回Object/void 返回 null

	//大致了解 反射
	//根据字符串加载类型到运行环境中, 获取Person类型
	Class cls = Class.forName("com.rgh.test.entity.Person");
	
	//获取									方法名		参数类型
	Method mt1 = cls.getDeclaredMethod("getPname");
	Method mt2 = cls.getDeclaredMethod("myTest1", int.class	, int.class);
	Method mt3 = cls.getDeclaredMethod("myTest2", String.class , int.class);
	
	//实例
	Object nts = cls.newInstance();
	
	//调用并 接收返回值
	Object ret1 = mt1.invoke(nts);			//调用nts对象的getPname()
	Object ret2 = mt2.invoke(nts, 10,50);	//调用nts对象的myTest1(10,50)
	Object ret3 = mt3.invoke(nts, "齐八",50);//调用nts对象的myTest2("齐八",50)
	
	System.out.println("1.."+ret1);	//字符串做为 成员变量 的默认值
	System.out.println("2.."+ret2);
	System.out.println("3.."+ret3);	//void本身是没有返回值的
	
	//--------------
	Field f1 = cls.getDeclaredField("pname");
	System.out.println("4.." +f1);
补充下异常
 * @throws ClassNotFoundException 	类型没有找到
 * @throws InstantiationException 	初始化错误
 * @throws NoSuchFieldException 	没有匹配的字段
 * @throws NoSuchMethodException	没有匹配的方法
 * 
 * @throws SecurityException  			安全性错误
 * @throws InvocationTargetException	目标调用异常   

XML文档解析

导入jar包

002.PNG

jdom解析

  1. 创建解析器new SAXBuilder()
  2. 创建一个输入流,将xml文件加载到输入流中
  3. 通过解析器的build方法,将输入流加载到解析器中返回Document对象
  4. 通过document对象获取xml文件的根节点Element rootElement = document.getRootElement()
  5. 获得根的名字rootElement.getName()
    获得属性名为name的值rootElement.getAttributeValue("name")
  6. 获取根节点下的子节点的List集合 List<Element> firstList = rootElement.getChildren();
  7. Element 方法getTextTrim(),获得文本 getChildText(“name”) 直接获取子节点信息
	
	package com.rgh.jdom;
	
	import java.io.FileInputStream;
	import java.io.FileNotFoundException;
	import java.io.IOException;
	import java.io.InputStream;
	import java.io.InputStreamReader;
	import java.util.List;
	
	import org.jdom2.Document;
	import org.jdom2.Element;
	import org.jdom2.JDOMException;
	import org.jdom2.input.SAXBuilder;
	
	public class A {
	
		/**
		 * @param args
		 */
		public static void main(String[] args) {
					//创建 xml 解析器: simple api of xml
					SAXBuilder saxBuilder = new SAXBuilder();
					InputStream in;
					try {
						// 1.创建一个输入流,将xml文件加载到输入流中
						in = new FileInputStream("src/testJdom.xml");
						InputStreamReader isr = new InputStreamReader(in, "UTF-8");
						// 2.通过saxBuilder的build方法,将输入流加载到saxBuilder中
						Document document = saxBuilder.build(isr);
						
						
						// 3.通过document对象获取xml文件的根节点
						Element rootElement = document.getRootElement();
						System.out.println("根:" + rootElement.getName() +"\t属性:" + rootElement.getAttributeValue("name"));
						// 4.获取根节点下的子节点的List集合
						List<Element> firstList = rootElement.getChildren();
						// 继续进行解析
						for (Element first : firstList) {
							System.out.println("一级节点:" + first.getName()+"\t属性:" + first.getAttributeValue("id"));
							
							//一级节点的子节点
							List<Element> subFirst = first.getChildren();
							for(Element sub : subFirst){
								System.out.println("\t子节点:" + sub.getName()+"\t文本:" + sub.getTextTrim());
								
								List<Element> studentList = sub.getChildren();
								if(null!=studentList && studentList.size()>0){
									for (Element stu : studentList) {
	//									//A .每一个学生的name 和 age
	//									List<Element> subStu = stu.getChildren();
	//									for(Element stuInfo : subStu){
	//										System.out.println("\t\t"+stuInfo.getName()+"\t:"+stuInfo.getTextTrim());
	//									}
										
										//B .直接获取子节点信息
										System.out.println("\t\t"+stu.getChildText("name")+"\t:"+ stu.getChildText("age") );
										
									}//
									
								}
							}//
							
						}
					} catch (FileNotFoundException e) {
						e.printStackTrace();
					} catch (JDOMException e) {
						e.printStackTrace();
					} catch (IOException e) {
						e.printStackTrace();
					}
		}
	
	}

用代码生成xml文件

Element的API
  1. 生成节点对象ElementElement root = new Element("books");
  2. 加入属性和值root.setAttribute("desc","helloworld");
  3. 加入文本firstName.setText("<![CDATA[森晨编程之旅 ]]>");
  4. 子节点加入一级节点firstNode.addContent(firstName);
文档对象Document

文档加入根节点Document doc = new Document(root);

格式化输出
Format format = Format.getCompactFormat();
format.setIndent("  ");//缩进占位
format.setEncoding("GBK");
创建XMLOutputter的对象
XMLOutputter outputer = new XMLOutputter(format);
利用outputer将document对象转换成xml文档 刷新项目可以看见该文档
outputer.output(doc, new FileOutputStream(new File("schbook.xml")));

代码演示:


	package com.rgh.jdom;
	
	import java.io.File;
	import java.io.FileNotFoundException;
	import java.io.FileOutputStream;
	import java.io.IOException;
	
	import org.jdom2.Document;
	import org.jdom2.Element;
	import org.jdom2.output.Format;
	import org.jdom2.output.XMLOutputter;
	
	public class B {
	
		public static void main(String[] args) {
			//根节点
			Element root = new Element("books");
			root.setAttribute("desc","helloworld"); 
			
			//一级节点
			Element firstNode = new Element("book");
			firstNode.setAttribute("isbn", "12345678");
			
			//子节点
			Element firstName = new Element("name");
			firstName.setText("<![CDATA[森晨编程之旅 ]]>");
			
			//子节点
			Element firstAuthor = new Element("author");
			firstAuthor.setText("oldman");
			
			//子节点加入一级节点
			firstNode.addContent(firstName);
			firstNode.addContent(firstAuthor);
			
			//一级节点
			Element secondNode = new Element("book");
			secondNode.setAttribute("isbn", "98765432");
			
			//子节点
			Element secondName = new Element("name");
			secondName.setText("森晨奇幻编程");
			
			//子节点
			Element secondAuthor = new Element("author");
			secondAuthor.setText("youngman");
			
			//子节点加入一级节点
			secondNode.addContent(secondName);
			secondNode.addContent(secondAuthor);
	
			//一级节点加入根节点
			root.addContent(firstNode);
			root.addContent(secondNode);
			
			//文档加入根节点
			Document doc = new Document(root);
			
			//准备格式化输出
			Format format = Format.getCompactFormat();
			format.setIndent("  ");//缩进占位
			format.setEncoding("GBK");
			
			//创建XMLOutputter的对象
			XMLOutputter outputer = new XMLOutputter(format);
			try {
				//利用outputer将document对象转换成xml文档  刷新项目可以看见该文档
				outputer.output(doc, new FileOutputStream(new File("schbook.xml")));
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
	
		}
	
	}

003.PNG

解析xml文件 dom4j

思路:

通过reader对象的read方法加载books.xml文件,获取docuemnt对象。
Document document = reader.read(new File("src/res/books.xml"));
通过document对象获取根节点bookstore
Elent.getRootElement();
通过element对象的elementIterator方法获取迭代器
Iterator it = bookStore.elment bookStore = documeementIterator();
遍历迭代器,获取根节点中的信息(书籍)
while (it.hasNext()) {
System.out.println("=====开始遍历某一本书=====");
Element book = (Element) it.next();
  1. 创建 xml 解析器: simple api of xml
    SAXReader reader = new SAXReader();
    InputStream in;

  2. 创建一个输入流,将xml文件加载到输入流中

    in = new FileInputStream(“src/testDom4j.xml”);
    InputStreamReader isr = new InputStreamReader(in, “UTF-8”);

  3. 通过saxBuilder的build方法,将输入流加载到saxBuilder中

    Document document = reader.read(isr);

  4. 通过document对象获取xml文件的根节点

     Element rootElement = document.getRootElement();
     System.out.println("根:" + rootElement.getName() +"\t属性:" + rootElement.attributeValue("name") );  
    
  5. 获取根节点下的子节点的List集合

     ator<Element> firstList = rootElement.elementIterator();
    
  6. 继续进行解析

     	while(firstList.hasNext()){
     		Element first = firstList.next();
     		System.out.println("一级节点:" + first.getName()+"\t属性:" + first.attributeValue("id"));
     		
     		//一级节点的子节点
     		Iterator<Element> subFirst = first.elementIterator();
     		while(subFirst.hasNext()){
     			Element sub = subFirst.next();
     			System.out.println("\t子节点:" + sub.getName()+"\t文本:" + sub.getTextTrim());
     			
     			Iterator<Element> studentList = sub.elementIterator();
     			while(studentList.hasNext()){
     				Element stu = studentList.next();
     				//A .每一个学生的name 和 age
     				Iterator<Element> subStu = stu.elementIterator();
     				while(subStu.hasNext()){
     					Element stuInfo = subStu.next();
     					System.out.println("\t\t"+stuInfo.getName()+"\t:"+stuInfo.getTextTrim());
     				}//						
     			}
     		}//
     	}
    

整个代码过程

	
	package com.rgh.jdom;
	
	import java.io.FileInputStream;
	import java.io.FileNotFoundException;
	import java.io.IOException;
	import java.io.InputStream;
	import java.io.InputStreamReader;
	import java.util.Iterator;
	import java.util.List;
	
	import org.dom4j.Document;
	import org.dom4j.DocumentException;
	import org.dom4j.Element;
	import org.dom4j.io.SAXReader;
	
	
	
	public class A {
	
		/**
		 * @param args
		 */
		public static void main(String[] args) {
			
			
	//		try {
	//			// 通过reader对象的read方法加载books.xml文件,获取docuemnt对象。
	//			Document document = reader.read(new File("src/res/books.xml"));
	//			// 通过document对象获取根节点bookstore
	//			Elent.getRootElement();
	//			// 通过element对象的elementIterator方法获取迭代器
	//			Iterator it = bookStore.elment bookStore = documeementIterator();
	//			// 遍历迭代器,获取根节点中的信息(书籍)
	//			while (it.hasNext()) {
	//				System.out.println("=====开始遍历某一本书=====");
	//				Element book = (Element) it.next();
	//		
			//创建 xml 解析器: simple api of xml
			SAXReader reader = new SAXReader();
			InputStream in;
			try {
				// 1.创建一个输入流,将xml文件加载到输入流中
				in = new FileInputStream("src/testDom4j.xml");
				InputStreamReader isr = new InputStreamReader(in, "UTF-8");
				// 2.通过saxBuilder的build方法,将输入流加载到saxBuilder中
				Document document = reader.read(isr);
				
				// 3.通过document对象获取xml文件的根节点
				Element rootElement = document.getRootElement();
				System.out.println("根:" + rootElement.getName() +"\t属性:" + rootElement.attributeValue("name") );
				
				// 4.获取根节点下的子节点的List集合
				Iterator<Element> firstList = rootElement.elementIterator();
				// 继续进行解析
				while(firstList.hasNext()){
					Element first = firstList.next();
					System.out.println("一级节点:" + first.getName()+"\t属性:" + first.attributeValue("id"));
					
					//一级节点的子节点
					Iterator<Element> subFirst = first.elementIterator();
					while(subFirst.hasNext()){
						Element sub = subFirst.next();
						System.out.println("\t子节点:" + sub.getName()+"\t文本:" + sub.getTextTrim());
						
						Iterator<Element> studentList = sub.elementIterator();
						while(studentList.hasNext()){
							Element stu = studentList.next();
							//A .每一个学生的name 和 age
							Iterator<Element> subStu = stu.elementIterator();
							while(subStu.hasNext()){
								Element stuInfo = subStu.next();
								System.out.println("\t\t"+stuInfo.getName()+"\t:"+stuInfo.getTextTrim());
							}//						
						}
					}//
				}//firstList
				
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			} catch (DocumentException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
	
		}//main()
	
	}

用代码生成xml文件,dom4j

话不多说直接看代码


	package com.rgh.jdom;
	
	import java.io.File;
	import java.io.FileOutputStream;
	import java.io.IOException;
	
	import org.dom4j.Document;
	import org.dom4j.DocumentHelper;
	import org.dom4j.Element;
	import org.dom4j.io.OutputFormat;
	import org.dom4j.io.XMLWriter;
	
	public class B {
	
		public static void main(String[] args) {
			
			//1.创建document对象,代表整个xml文档
			Document document = DocumentHelper.createDocument();
			
			//根节点
			Element root = document.addElement("books");
			root.addAttribute("desc","helloworld"); 
			
			//一级节点
			Element firstNode = root.addElement("book");
			firstNode.addAttribute("isbn", "12345678");
			
			//子节点
			Element firstName = firstNode.addElement("name");
			firstName.setText("<![CDATA[森晨编程之旅 ]]>");
			
			//子节点
			Element firstAuthor = firstNode.addElement("author");
			firstAuthor.setText("oldman");
			
			
			//一级节点
			Element secondNode = root.addElement("book");
			secondNode.addAttribute("isbn", "98765432");
			
			//子节点
			Element secondName = secondNode.addElement("name");
			secondName.setText("森晨奇幻编程");
			
			//子节点
			Element secondAuthor = secondNode.addElement("author");
			secondAuthor.setText("youngman");
			
			
			OutputFormat format = OutputFormat.createPrettyPrint();
			format.setIndent("    ");
			format.setEncoding("GBK");
			//6.生成xml文件
			File file = new File("schbookdom4j.xml");
			XMLWriter writer;
			try {
				writer = new XMLWriter(new FileOutputStream(file), format);
				//设置是否转义,默认值是true,代表转义
				writer.setEscapeText(false);
				writer.write(document);
				writer.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
	
		}
	
	}

生成的xml文件

004.PNG

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值