`
郑云飞
  • 浏览: 823207 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

反射从配置文件中读取

OO 
阅读更多
className=teacher.TT
con_A_count=3
con_Args1=int
con_Args2=String
con_Args3=int
con_obj1=12
con_obj2=zheng
con_obj3=22
me_Aa_name=test
me_Ab_count=3
me_Args1=int
me_Args2=String
me_Args3=int
me_obj1=22
me_obj2=郑云飞
me_obj3=22

 

package hashMap;
import java.io.FileInputStream;
import java.lang.reflect.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
/**
 * @author 郑云飞
 * 内容:反射从配置文件中读取信息
 * date:2010年9月27日PM
 */
class ReflectTest 
{
	@SuppressWarnings("unchecked")
	public static void main(String[] args) throws Exception
	{
		Properties pp=new Properties();
		List<String> ls=new ArrayList<String>();
	    pp.load(new FileInputStream("propers.ini"));//加载配置文件内容
		Iterator<String> it1=(Iterator<String>) pp.propertyNames();
		while(it1.hasNext())
		{
			ls.add(it1.next());//将配置文件里的键存放的容器中
		}
		Collections.sort(ls);//对容器进行自然排序
		String[] s = new String[ls.size()];
		for(int i=0;i<ls.size();i++)
		{
			 byte []data=pp.getProperty(ls.get(i)).getBytes("iso8859-1");//设置字符编码
			 ls.set(i, new String(data,"gb2312"));//为容器ls赋值
			 s[i]=ls.get(i);//将容器ls复制到字符串数组s中
		}
		Class<?> cl = Class.forName(s[0]);//获得要调用的类名
		Object o = getObject(cl, s);//获得对象
		invoke(cl, o, s);//通过对象调用方法
		}
	//用反射产生对象并返回该对象
	public static Object getObject(Class<?> cl,String[] args) throws Exception
	{
		int con_Count = Integer.parseInt(args[1]);
		Object o = null;
		if(con_Count==0)
		{
			o = cl.newInstance();
		}
		else
		{
			Class<?>[] con_Args = new Class[con_Count];
			Object[] obj_Args = new Object[con_Count];
			Object[] oo = null;
			for(int i=0;i<con_Count;i++)
			{
				oo = turn(args[2+i],args[2+i+con_Count]);

				con_Args[i] = (Class<?>)oo[0];
				obj_Args[i] = oo[1];

			}
			Constructor<?> con = cl.getDeclaredConstructor(con_Args);
			o = con.newInstance(obj_Args);
		}
		return o;
	}

	//用反射执行某一方法并返回结果
	public static Object invoke(Class<?> cl,Object o,String[] args) throws Exception
	{
		int con_Count = Integer.parseInt(args[1]);
		String methodName = args[2+2*con_Count];		
		int me_Count = Integer.parseInt(args[3+2*con_Count]);
		Class<?>[] me_Args = new Class[me_Count];
		Object[] me_Obj_Args = new Object[me_Count];
		Object[] oo = null;
		for(int i=0;i<me_Count;i++)
		{
			oo = turn(args[4+2*con_Count+i],args[4+2*con_Count+i+me_Count]);

			me_Args[i] = (Class<?>)oo[0];
			me_Obj_Args[i] = oo[1];			
		}

		Method m = cl.getDeclaredMethod(methodName,me_Args);
		Object res = m.invoke(o,me_Obj_Args);
		//System.out.println("方案执行结果:"+res);
		return res;
	}

	public static Object[] turn(String cType,String oArg)
	{
		Object[] o = new Object[2];

		if(cType.equals("int"))
		{
			o[0] = int.class;
			o[1] = Integer.parseInt(oArg);
		}
		if(cType.equals("String"))
		{
			o[0] = String.class;
			o[1] = oArg;
		}
		if(cType.equals("float"))
		{
			o[0] = float.class;
			o[1] = Float.parseFloat(oArg);
		}
		if(cType.equals("char"))
		{
			o[0] = char.class;
			o[1] = oArg.charAt(0);
		}
		if(cType.equals("boolean"))
		{
			o[0] = boolean.class;
			o[1] = Boolean.parseBoolean(oArg);
		}
		return o;
	}
}
class TT
{
	int age;
	String name;
	int id;
	
	public TT(int age,String name,int id)
	{
		this.age=age;
		this.name=name;
		this.id=id;
	}
	public static void test(int age,String name,int id)
	{
		System.out.println("从配置文件中读取到的方法的信息为:\n"+"年龄="+age+"\t姓名="+name+"  编号="+id);
	}
	@Override
	public String toString()
	{
		// TODO Auto-generated method stub
		return "年龄:"+age+"姓名:"+name+"编号:"+id;
	}
	
}

 

分享到:
评论

相关推荐

    Java 反射读取配置文件及反射类

    这个工程是使用 java 来使用反射的原理读取 *.proproies 资源文件中的一些配置信息。利用此方法可以在没有使用框架的情况下可以让你的程序更加灵活易于修改。如:可以将一些数据库配置信息,重要信息写入到资源文件...

    c#根据配置文件进行反射

    // 从配置文件中读取类库、类型和方法名 string assemblyName = ConfigurationManager.AppSettings["assemblyName"]; string typeName = ConfigurationManager.AppSettings["typeName"]; string methodName = ...

    C#工厂模式结合反射+配置文件+外观模式实例

    例如,我们可以将要创建的类名写入配置文件,然后在运行时通过反射读取这些信息并创建对应的对象。 4. **外观模式**: 外观模式又称为门面模式,它提供了一个统一的接口,用来访问子系统中的一组接口。在C#项目中...

    C# 性能分析 反射 VS 配置文件 VS 预编译

    这可能包括创建多个测试用例,如频繁地创建和使用反射生成的对象,或者对比配置文件读取与预编译加载的性能。 总的来说,C#开发者应根据项目需求和性能要求权衡使用反射、配置文件和预编译。在对性能有严格要求的...

    基于反射+配置文件动态选择数据库

    在Java编程中,"基于反射+配置文件动态选择数据库"是一种常见的高级技术,它结合了反射、配置文件读取和数据库连接管理等多个核心概念。这种技术主要用于构建灵活、可扩展的应用程序,允许根据运行时环境或用户需求...

    java中的@Value获取不到配置文件的值,也加载不到默认值

    自己开发一个工具类,为第三方应用提供调用接口,但是打包后测试过程中,发现了一个问题就是在用@Value获取配置文件内容的时候,无法获取我们的配置信息,也无法加载我们配置的默认值!具体配置如下: @Value("${...

    Java读取含中文key的properties文件

    以下将详细介绍如何在Java中读取含中文key的Properties文件,并利用反射调用相关方法。 首先,我们需要理解Java的Properties类。`java.util.Properties`是Java标准库中的一个类,它提供了一种加载和保存属性列表的...

    Spring读取配置文件原理(Spring如何依赖注入的)

    1. 加载XML文件:通过`Resource`接口加载指定的XML配置文件,`ClassPathResource`是常用的实现类,可以从类路径中加载资源。 2. 解析XML:使用`DocumentBuilder`解析XML文档,获取DOM树。 3. 遍历DOM树:`...

    java反射配置文件实现

    用反射原理 从配置文件中读取数据 public static void main(String[] args) throws Exception{ Properties pro=new Properties(); pro.load(new FileInputStream("fanshe.txt")); //Class c=null; String ...

    任意自定义结构体Json配置文件读写

    由于ini原生不支持树结构,需要根据需要将父节点的option作为子节点的section,配置文件可读性变差。xml由于属性和元素分开的形式,不适合直接转为c++定义的树状结构。所以最终选择了json。 要想用c++实现一个通用...

    Hibernate配置文件加载后修改配置信息

    本文将详细介绍如何利用反射机制来修改已经加载到内存中的`hibernate.cfg.xml`配置文件中的信息,并将这些配置信息提取到其他路径下的过程。 #### 一、了解Hibernate配置文件 在Hibernate框架中,`hibernate.cfg....

    用反射机制改进的抽象工厂

    用反射机制改进的抽象工厂

    C# WinForm 动态加载DLL 通过配置文件

    总结来说,C# WinForm通过配置文件动态加载DLL的关键步骤包括:读取配置文件中的DLL路径,使用`Assembly.LoadFrom`加载DLL,通过反射获取并实例化DLL中的类,最后调用类的方法执行功能。这种方法提高了代码的可维护...

    LAS文件读取库

    描述中提到的博客链接指向了一篇详细介绍如何配置LAS文件读取库的文章。虽然我们无法直接查看该博客内容,但通常这类文章会涵盖以下几点: 1. 安装和配置:介绍如何在不同的操作系统(如Windows、Linux、macOS)上...

    根据XML配置文件自动生成窗体控件

    `XmlConfigRead`可能是项目中的一个类,负责读取和解析XML配置文件。它可能包含如下的方法: ```csharp public class XmlConfigRead { public List&lt;ControlInfo&gt; ParseConfig(string filePath) { // 读取XML文件...

    Java项目开发用的公用基础模块,包括:Spring容器初始化、配置文件读取工具类、分页对象、Protobuf工具类、反射工具类

    Java项目开发用的公用基础模块,包括:Spring容器初始化、配置文件读取工具类、分页对象、Protobuf工具类、反射工具类等

    C#插件模式,反射加载DLL,INI文件配置

    1. 主程序启动,读取INI配置文件,解析出需要加载的插件信息。 2. 使用Assembly.LoadFrom加载指定路径的DLL文件。 3. 通过反射查找插件接口(比如定义了插件行为的IPlugin接口),并实例化插件类。 4. 将实例化的...

    读取文件数据并解析成bean实体类

    总的来说,从文件读取数据并解析成Bean实体类涉及多个层次的技术,包括基础的文件I/O、数据解析、对象映射以及高级的工具类设计。开发者需要熟悉这些技术,并能够灵活运用,以实现高效、稳定的文件数据处理。在项目...

    详解Java项目中读取properties文件

    在Java项目中,读取properties文件是常见的任务,主要用于配置应用程序的参数或环境设置。本文将详细介绍几种在Java中读取properties文件的方法,并探讨在不同场景下的适用性。 首先,最常用的读取properties文件的...

    可视化编辑App.config配置文件

    总之,结合C#、`PropertyGrid`控件、反射以及`App.config`文件,我们可以创建一个强大的配置文件编辑工具,提高了开发人员的工作效率,同时也降低了用户配置应用的难度。这种可视化编辑方法不仅适用于简单的键值对,...

Global site tag (gtag.js) - Google Analytics