Servlet第8节总结 反射机制

1.反射机制举例

package com.neusoft2;

import java.lang.reflect.Constructor;
import java.lang.reflect.Parameter;

public class Text {
		public static void main(String[] args) {
			
			try {
//				.class字节码文件
//				Class《?》 代表的是类的信息,pinfo是preson类的字节码文件对象
				Class<Preson> pinfo=(Class<Preson>) Class.forName("com.neusoft2.Preson");
//				得到一个构造器数组,代表构造器集合
				Constructor [] cs=pinfo.getConstructors();
				for(Constructor c:cs) {
//					输出构造器的名字
					System.out.println(c.getName());
//				每个构造器参数组成的数组
					Parameter[] ps=c.getParameters();
					for(Parameter p:ps) {
//						每个参数的名字
						System.out.println(p.getName());
//						每个参数对应的类型
						System.out.println(p.getType().getTypeName());
					}
				}	
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (NoSuchMethodException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (SecurityException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
}

//利用反射机制 得到类的(私有属性也可以得到)属性
//类的字段等价于类的属性
//				得到的preson类的name属性
				Field pname=pinfo.getDeclaredField("name");
//				反射机制可以访问私有属性,甚至给私有属性赋值
//              对私有属性进行改变 让其可以被访问
				pname.setAccessible(true);
//				给私有属性赋值前依然需要得到Preson类的对象。利用字节码对象的newinstance()得到的
				Preson p1=pinfo.newInstance();
				pname.set(p1, "你好");
				System.out.println(p1.getName());
	//利用反射机制获得方法(包括父类 继承关系的方法)
				Method pchu=pinfo.getMethod("chu", null);
				pchu.invoke(p1, null);
	//pinfo.getDeclaredMethod(name, parameterTypes)
	//利用反射机制得到接口实现的方法

2.使用场景:
2.1首先通过解析xml文件
2.2得到所谓的插件的字节码
2.3通过字节码的newIntance方法得到接口实现类对象,然后在转型相应接口类型 在为app的业务方法使用

package com;

import java.io.File;
import java.util.Iterator;

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

public class App {
	private Query dq;
	public void doQuery(){
		dq.doQuery();
	}
	public void setDq(Query dq) {
		this.dq = dq;
	}
	
	public void init(){
		// 1.创建Reader对象
		SAXReader sr = new SAXReader();

		// 2.加载文档

		File f = new File("myxml/Student.xml");
		// 3.获取根元素
		try {
			// 4.获得xml文档对象
			Document document = sr.read(f);
			// 5.获取XML文档的根节点
			Element root = document.getRootElement();
			// 6.获取遍历子元素的迭代器
			Iterator<Element> iterator = root.elementIterator();
			while (iterator.hasNext()) {
				// 获取第一层级user节点
				Element user = iterator.next();
				// 获取每层user下的子节点迭代器
				Iterator<Element> cniterator = user.elementIterator();
				while (cniterator.hasNext()) {
					Element cn = cniterator.next();
					System.out.println(cn.getName() + ":" + cn.getStringValue());
					Class uc = Class.forName(cn.getStringValue());
					this.setDq((Query) uc.newInstance());
				}

			}

		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

在这里插入图片描述
在这里插入图片描述
解析xml 4j

package com;

import java.io.File;
import java.util.Iterator;

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

public class Dom4JDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// 1.创建Reader对象
		SAXReader sr = new SAXReader();

		// 2.加载文档

		File f = new File("myxml/Student.xml");
		// 3.获取根元素
		try {
			// 4.获得xml文档对象
			Document document = sr.read(f);
			// 5.获取XML文档的根节点
			Element root = document.getRootElement();
			// 6.获取遍历子元素的迭代器
			Iterator<Element> iterator = root.elementIterator();
			while (iterator.hasNext()) {
				// 获取第一层级user节点
				Element user = iterator.next();
				// 获取每层user下的子节点迭代器
				Iterator<Element> cniterator = user.elementIterator();
				while (cniterator.hasNext()) {
					Element cn = cniterator.next();
					System.out.println(cn.getName() + ":" + cn.getStringValue());
					Class uc = Class.forName(cn.getStringValue());

				}

			}

		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值