反射理解
反射:对于任意一个类型,可以获取其方法和属性的
任意一个对象,可以访问其方法和属性的能力Class类型
Class 类型
Field 属性/字段
Method 方法
用反射创建对象并调用对象的方法
//大致了解 反射
//根据字符串加载类型到运行环境中, 获取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()
获得用反射创建的对象的属性和方法
- 自己的 getDeclaredFields,getDeclaredMethods
- 自己和继承的public的 getFields,getMethods
- 自己的构造 getDeclaredConstructors
- 所有接口 getInterfaces
- 所有内部类 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);
}
反射获取指定方法并调用,获取属性
- 单个属性 getDeclaredField
- 单个方法 getDeclaredMethod(方法名,参数类型)
- 创建实例 cls.newInstance()
- 调用实例 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包
jdom解析
- 创建解析器
new SAXBuilder()
- 创建一个输入流,将xml文件加载到输入流中
- 通过解析器的build方法,将输入流加载到解析器中返回Document对象
- 通过document对象获取xml文件的根节点
Element rootElement = document.getRootElement()
- 获得根的名字
rootElement.getName()
获得属性名为name的值rootElement.getAttributeValue("name")
- 获取根节点下的子节点的List集合
List<Element> firstList = rootElement.getChildren();
- 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
- 生成节点对象Element
Element root = new Element("books");
- 加入属性和值
root.setAttribute("desc","helloworld");
- 加入文本
firstName.setText("<![CDATA[森晨编程之旅 ]]>");
- 子节点加入一级节点
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();
}
}
}
解析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();
-
创建 xml 解析器: simple api of xml
SAXReader reader = new SAXReader();
InputStream in; -
创建一个输入流,将xml文件加载到输入流中
in = new FileInputStream(“src/testDom4j.xml”);
InputStreamReader isr = new InputStreamReader(in, “UTF-8”); -
通过saxBuilder的build方法,将输入流加载到saxBuilder中
Document document = reader.read(isr);
-
通过document对象获取xml文件的根节点
Element rootElement = document.getRootElement(); System.out.println("根:" + rootElement.getName() +"\t属性:" + rootElement.attributeValue("name") );
-
获取根节点下的子节点的List集合
ator<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()); }// } }// }
整个代码过程
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();
}
}
}