反射&XML

南笙酒味 提交于 2019-12-26 14:44:07

Day13 反射&XML

反射

什么是反射 ###

JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

就是对已经存在的类,获取其字段,方法 构造方法作相应(字段:,方法:,构造方法:)

反射的作用

  1. 增加程序的灵活性,避免将程序写死到代码里(解决硬编码的问题)
  2. java的反射机制知道类的基本结构,可以动态的去获取类这样的结构
  3. 可以让程序员在不知道其他程序员会有什么类的时候就编写完成自己的代码
  4. 反射的优点:灵活,功能强大(可以拿到私有化的.)
  5. 反射的缺点:破坏封装 影响性能

Class类的实例&哪些文件能生成class对象

Class类的实例表示正在运行的Java应用程序中的类和接口
枚举是一种类
注解是一种接口
每个数组属于被映射为Class对象的一个类,所有具有相同元素的类型和维数的数组都共享该Class对象
基本的Java类型(boolean,byte,char,short,int,long,float和double和关键字void也表示为Class对象)可以用包装类.TYPE获取基本数据类型的class对象
类 数据 接口 基本数据类型I

获取Class对象的方式

  1. Class.forName(String name); name–>全限定名
  2. 类名.class
  3. 对象.getClass

获取构造方法

  • Constructor getConstructor(Class… p) 返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。
  • Constructor[] getConstructors() 返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。
  • Constructor getDeclaredConstructor(Class… p) 返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法。
  • Constructor[] getDeclaredConstructors() 返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。

通过反射创建对象

Constructor:

  • T newInstance(Object… initargs) 使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。
  • void setAccessible(boolean flag) 将此对象的 accessible 标志设置为指示的布尔值。
    • flag --false:要检查权限
    • flag --true:忽略检查权限
Class cla = Person.class;
Constructor c = cla.getDeclaredConstructor(String.class,int.class);
Constructor c = cla.getDeclaredConstructor(String.class);

//正常创建对象的方式
//Person p = new Person("MT",20);
//不能够使用没有权限的构造方法创建对象--检查权限

//让权限检查失效
c.setAccessible(true);
Object o = c.newInstance("San");
System.out.println(o);
//要求 类必须有公共无参的构造方法
Object object = cla.newInstance();
System.out.println(object);

获取方法

获取公共的方法(包括继承的方法)

  • Method getMethod(String name, Class<?>… parameterTypes) 返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。
  • Method[] getMethods() 返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。

获取全部的方法(不包括继承的方法)

  • Method getDeclaredMethod(String name, Class<?>… parameterTypes) 返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。
  • Method[] getDeclaredMethods() 返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
Class cla = Person.class;
//获取全部的方法
Method[] methods = cla.getDeclaredMethods();

for (Method method : methods) {
	System.out.println(method);
}

//获取指定的方法
Method method = cla.getDeclaredMethod("setName", String.class);
System.out.println(method);
//Person p = new Person();
Object object = cla.newInstance();
method.invoke(object, "MT");
System.out.println(object);

//调用私有化的方法
Method m = cla.getDeclaredMethod("getName");

//让权限检查失效
m.setAccessible(true);

//invoke返回值就是 方法执行完后的结果
Object invoke = m.invoke(object);
System.out.println(invoke);
	

获得字段:

  • Field getField(String name) 返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。

  • Field[] getFields() 返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。

  • Field getDeclaredField(String name) 返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。

  • Field[] getDeclaredFields() 返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。

  • void set(Object obj, Object value) 将指定对象变量上此 Field 对象表示的字段设置为指定的新值。

  • Object get(Object obj) 返回指定对象上此 Field 表示的字段的值。

Class cla= Person.class;

//获取全部的字段
Field[] fields = cla.getDeclaredFields();

for (Field field : fields) {
	System.out.println(field);
}

//获取指定的字段
Field field = cla.getDeclaredField("tel");
System.out.println(field);

//忽略权限检查
field.setAccessible(true);
Person p = new Person();
field.set(p, "2385915978");

Object object = field.get(p);
System.out.println(object);

dom4j解析XML

  • SAXReader:文档解析器
  • Document read(File in):把一个文档转换为Document对象
  • Element getRootElement():获取根节点
  • List elements(String name):以一个list返回所有的指定名字的元素
  • Element element(String name); 根据名字返回指定元素
  • String getText();获取元素的文本内容
  • void setText(String str);给指定的元素添加文本内容
  • Element addElement(String str);追加节点元素
  • Element addAttribute(String str1,String str2):给元素设置属性

对XML文档进行CRUD


	@Test
	public void testGetDom() throws Exception {
		 SAXReader reader = new SAXReader();
		 InputStream in =  new FileInputStream("D:/Users/lsdn/eclipse-workspace/Day13/src/cn/itsource/_04dm4j/contacts.xml");
	     Document doc = reader.read(in);
	     System.out.println(doc);
	     
	}
	@Test
	public void testGetName() throws Exception {
		SAXReader reader = new SAXReader();
		InputStream in =  new FileInputStream("D:/Users/lsdn/eclipse-workspace/Day13/src/cn/itsource/_04dm4j/contacts.xml");
		//读取文件内容
		Document dom = reader.read(in);
		
		//获取根元素
		Element root = dom.getRootElement();
		
		//获取根节点下的所有linkman
		List<Element> list = root.elements("linkman");
		
		//获取第二个联系人
		Element linkman = list.get(1);
		
		//获取 name 元素
		Element name = linkman.element("name");
		
		//获取元素的文本内容
		String TextName = name.getText();
		
		System.out.println(TextName);
		
	}
	@Test
	public void testUpdateEmail() throws Exception {
		SAXReader reader = new SAXReader();
		InputStream in =  new FileInputStream("D:/Users/lsdn/eclipse-workspace/Day13/src/cn/itsource/_04dm4j/contacts.xml");
		//读取文件内容
		Document dom = reader.read(in);
		
		//获取根元素
		Element root = dom.getRootElement();
		
		//获取根节点下的所有linkman
		List<Element> list = root.elements("linkman");
		
		//获取第一个联系人
		Element linkman = list.get(0);
		
		//获取第一个联系人的邮箱
		Element email = linkman.element("email");
		
		//获取文本 
		System.out.println(email.getText());
		email.setText("hh@qq.com");
		 
		//把内存中Dom对象 同步到指定的文件
		//指定要输出的文件地址
		Writer w =  new FileWriter( "D:/Users/lsdn/eclipse-workspace/Day13/src/cn/itsource/_04dm4j/contacts.xml" );
		XMLWriter writer = new XMLWriter(w);
		writer.write(dom);
		writer.close();
		
	}
	//	3、向指定元素节点中增加子元素节点:增加一个联系人信息
	@Test
	public void testCreateLinkman() throws Exception {
		SAXReader reader  = new SAXReader();
		File f = new File("D:/Users/lsdn/eclipse-workspace/Day13/src/cn/itsource/_04dm4j/contacts.xml");
		//解析文件
		Document dom = reader.read(f);
		
		//获取根节点
		Element root = dom.getRootElement();
		
		//在根节点后面追加一个linkman
		Element linkman = root.addElement("linkman");
		
		//设置属性
		linkman.addAttribute("id","3");
		
		//追加 name  address...
		linkman.addElement("name").addText("ler");
		linkman.addElement("email").addText("2385@qq.com");
		linkman.addElement("address").addText("qq邮箱");
		linkman.addElement("group").addText("为了联盟");
		
		//把内存中Dom对象 同步到指定的文件  指定要输出的文件地址
		Writer w =  new FileWriter(f);
		XMLWriter writer = new XMLWriter(w);
		writer.write(dom);
		writer.close();
	}
	
	@Test
	public void testRemove() throws Exception {
		SAXReader reader  = new SAXReader();
		File f = new File("D:/Users/lsdn/eclipse-workspace/Day13/src/cn/itsource/_04dm4j/contacts.xml");
		//解析文件
		Document dom = reader.read(f);
		//获取根节点
		Element root = dom.getRootElement();
		List<Element> list = root.elements("linkman");
		Element linkman = list.get(2);
		
		//获取删除元素和父节点 ,删除指定的元素
		linkman.getParent().remove(linkman);
		
		//把内存中Dom对象 同步到指定的文件
		//指定要输出的文件地址
		Writer w =  new FileWriter(f);
		XMLWriter writer = new XMLWriter(w);
		writer.write(dom);
		writer.close();
	}
	
	@Test
	public void testCreateLinkman2() throws Exception {
		SAXReader reader  = new SAXReader();
		File f = new File("D:/Users/lsdn/eclipse-workspace/Day13/src/cn/itsource/_04dm4j/contacts.xml");
		//解析文件
		Document dom = reader.read(f);
		//获取根节点
		Element root = dom.getRootElement();
		//在根节点后面追加一个linkman
		Element linkman = root.addElement("linkman");
		//给linkman 设置属性
		linkman.addAttribute("id","4");
		
		linkman.addElement("name").addText("ler");
		linkman.addElement("email").addText("9159@qq.com");
		linkman.addElement("address").addText("qq邮箱");
		linkman.addElement("group").addText("为了联盟");
		
		
		//把内存中Dom对象 同步到指定的文件
		//指定要输出的文件地址
		Writer w =  new FileWriter(f);
		//创建的xml输出格式
		OutputFormat format = OutputFormat.createPrettyPrint();
		XMLWriter writer = new XMLWriter(w,format);
		writer.write(dom);
		writer.close();
	}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!