XML解析与反射机制的结合使用 (1)- 初步(简单实现调用指定类的指定方法)

xml文档



	
		
		
	

指定类与指定方法

package com.mec.test;

public class IntAdd {
	
	public int add(int a,int b) {
		int c;
		c = a + b;
		System.out.println("a + b = " + c);
		return c;
	}

}

分析

  1. 首先需要解析XML文件;
  2. 解析出来的所有信息节点都是String类型,但是在利用反射机制找到指定方法时,需要知道所对应的参数类类型,所以需要想办法将String类型的参数转换成与其对应的类类型;
    public Method getMethod(String paramString, Class... paramVarArgs);
  3. 在用invoke()调用指定方法时,需要知道该参数的值,所以在得到参数对应的类类型之后,需要将其String类型的值转换成对应类类型的值;
    public Object invoke(Object paramObject, Object... paramVarArgs);
  4. 最后利用反射机制,找到指定类、指定方法,并调用。

**~~

实现代码

~~ **

  • 解析XML文件

首先利用之前所写的 xml解析工具 对该xml文档进行解析,得到文档信息

package com.mec.parserAndReflect;

import java.util.ArrayList;

import org.w3c.dom.Element;

import com.mec.util.parser.XMLParser;

public class xmlParserForFun {
	private String className;
	private String methodName;
	private ArrayList paraTypeList;
	private ArrayList paraValueList;
	
	
	public xmlParserForFun() {
		className = "";
		methodName = "";
		paraTypeList = new ArrayList<>();
		paraValueList = new ArrayList<>();
	}
	
	public ArrayList getParaTypeList() {
		return paraTypeList;
	}

	public void setParaTypeList(ArrayList paraTypeList) {
		this.paraTypeList = paraTypeList;
	}

	public ArrayList getParaValueList() {
		return paraValueList;
	}

	public void setParaValueList(ArrayList paraValueList) {
		this.paraValueList = paraValueList;
	}

	public String getClassName() {
		return className;
	}

	public void setClassName(String className) {
		this.className = className;
	}

	public String getMethodName() {
		return methodName;
	}

	public void setMethodName(String methodName) {
		this.methodName = methodName;
	}

	public void Parser(String path,String tagNameRoot,String subTagName) {
		try {
			new XMLParser() {
				
				@Override
				public void dealElement(Element element, int index) {
					className = element.getAttribute("class");
					methodName = element.getAttribute("method");
					new XMLParser() {
						
						@Override
						public void dealElement(Element element, int index) {
							String paraType = element.getAttribute("type");
							String paraValue = element.getAttribute("value");
							paraTypeList.add(paraType);
							paraValueList.add(paraValue);
							}
					}.parse(element, subTagName);
				}
			}.parse(XMLParser.loadXML(path), tagNameRoot);
		} catch (Exception e) {
			e.printStackTrace();
		};
	}
	
}

  • 设置一个存在映射关系类

因为 键“String类型” 与 值“class” 的映射关系是一对一,所以通过HashMap用键值对进行存储,查找起来也很方便
该类主要功能是:

  • 通过给定字符串类型的信息,找到其对应的类类型;
  • 也可以在HashMap里面添加新的键值对
  • 在找指定类型时,若找不到,则利用class.forName(String …) 找到对应类型
package com.mec.parserAndReflect;

import java.util.HashMap;
import java.util.Map;

public class ClassBeanFactory {
	private static final Map> strClassMap = new HashMap<>();
	
	public ClassBeanFactory() {
		strClassMap.put("int", int.class);
		strClassMap.put("double", double.class);
		strClassMap.put("String", String.class);
		strClassMap.put("boolean", boolean.class);
	}
	
	public void setValue(String type) {
		try {
			strClassMap.put(type, Class.forName(type));
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	public Class getClass(String type) {
		return strClassMap.get(type);
	}
	
	public Class SearchClass(String para) throws ClassNotFoundException {
		for(String key : strClassMap.keySet()) {
			if(key.equals(para)) {
				return strClassMap.get(key);
			}
		}
		return Class.forName(para);
	}

}

  • 对参数进行处理

在进行参数处理时,需要考虑其类型,以及其对应类型的值的转换
(本类中只是简单是对基本类型进行了处理,其余复杂的类的转换未实现)

package com.mec.parserAndReflect;

import java.util.ArrayList;

public class DealPara {
	private ArrayList> paraClassList;
	private ArrayList paras;
	
	public DealPara() {
		paraClassList = new ArrayList<>();
		paras = new ArrayList<>();
	}

	public ArrayList> getParaClassList() {
		return paraClassList;
	}

	public void setParaClassList(ArrayList> paraClassList) {
		this.paraClassList = paraClassList;
	}

	public ArrayList getParas() {
		return paras;
	}

	public void setParas(ArrayList paras) {
		this.paras = paras;
	}

	public void setParaClassList(ClassBeanFactory cbf,ArrayList paraTypeList) throws ClassNotFoundException{

		for(String str : paraTypeList) {
			paraClassList.add(cbf.SearchClass(str));
		}
	}
	
	public Class getOneParaClass(int index) {
		return paraClassList.get(index);
	}
	
	public Object changeOnePara(ArrayList paraValuesList,int index) {
		
			if(paraClassList.get(index).equals(int.class)) {
				return Integer.valueOf(paraValuesList.get(index));
			} else if (paraClassList.get(index).equals(double.class)) {
				return Double.valueOf(paraValuesList.get(index));
			} else if (paraClassList.get(index).equals(boolean.class)) {
				return Boolean.valueOf(paraValuesList.get(index));
			} else if (paraClassList.get(index).equals(float.class)) {
				return Float.valueOf(paraValuesList.get(index));
			} else if (paraClassList.get(index).equals(String.class)) {
				return String.valueOf(paraValuesList.get(index));
			}
		
		return null;
	}
	
	public Integer getIntOneParaValue(ArrayList paraValueList,int index) {
		return Integer.valueOf(paraValueList.get(index));
	}
	
	public Double getDoubleOneParaValue(ArrayList paraValueList,int index) {
		return Double.valueOf(paraValueList.get(index));
	}
}

 
  
  • 测试
package com.mec.test;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;

import com.mec.parserAndReflect.ClassBeanFactory;
import com.mec.parserAndReflect.DealPara;
import com.mec.parserAndReflect.xmlParserForFun;

public class Demo {
	public static void main(String[] args) {
		
		xmlParserForFun xmpf = new xmlParserForFun();
		ClassBeanFactory cbf = new ClassBeanFactory();
		DealPara dp = new DealPara();
		ArrayList> ParaClassList = new ArrayList<>();
		ArrayList paras= new ArrayList<>();
		
		xmpf.Parser("/fun.xml","fun", "para");
		try {
			dp.setParaClassList(cbf,xmpf.getParaTypeList());
		} catch (ClassNotFoundException e1) {
			e1.printStackTrace();
		}
		ParaClassList = dp.getParaClassList();
		try {
			Class klass = Class.forName(xmpf.getClassName());
			Object obj = klass.newInstance();
			Method method = klass.getMethod(xmpf.getMethodName(),ParaClassList.get(0),ParaClassList.get(1));

			for(int index = 0;index < ParaClassList.size();index++) {
				Object para = dp.changeOnePara(xmpf.getParaValueList(),index);
				paras.add(para);
			}
			System.out.println("a: " + paras.get(0) + "   b: " + paras.get(1));
			method.invoke(obj, paras.get(0),paras.get(1));
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		} 
	}
}

 
  

运行结果

a: 54   b: 24
a + b = 78

你可能感兴趣的:(JAVA学习笔记)