运用反射读配置动态调用方法

看了反射,记录一下,非常好用!

定义一个公共接口

public interface IOffice {
    
	 public void run(String s);
}

实现类

public class WordImpl implements IOffice {
 
	public void run(String s)
	{
		System.out.println("Word"+s);
	}
}

public class ExcelImpl implements IOffice{
	
	public  void run(String s)
	{
		System.out.println("Excel"+s);
	}
}

配置文件 config.properties

method=run

一个操作配置的工具类

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

public class PropertiesUtil {

	private String configPath = null;

	private Properties props = null;

	public PropertiesUtil() throws IOException {
		InputStream in = PropertiesUtil.class.getClassLoader().getResourceAsStream("config.properties");
		props = new Properties();
		props.load(in);
		in.close();
	}

	public String readValue(String key) throws IOException {
		return props.getProperty(key);
	}

	public Map<String, String> readAllProperties() throws FileNotFoundException, IOException {
		Map<String, String> map = new HashMap<String, String>();
		Enumeration en = props.propertyNames();
		while (en.hasMoreElements()) {
			String key = (String) en.nextElement();
			String Property = props.getProperty(key);
			map.put(key, Property);
		}
		return map;
	}

	public void setValue(String key, String value) throws IOException {
		Properties prop = new Properties();
		InputStream fis = new FileInputStream(this.configPath);
		prop.load(fis);
		OutputStream fos = new FileOutputStream(this.configPath);
		prop.setProperty(key, value);
		prop.store(fos, "last update");
		fis.close();
		fos.close();
	}
}

测试类

import java.lang.reflect.Method;

public class Demo {

	public static void main(String[] args) {

		try {
			Class c = Class.forName(args[0]);
			IOffice iof = (IOffice) c.newInstance();
			Method m = iof.getClass().getMethod(new PropertiesUtil().readValue("method"), String.class);
			m.invoke(iof, "动态调用");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}


本例试验了动态调用实现类实例化对象和通过反射从参数中调用方法,运行时输入参数WordImpl或ExcelImpl,其实也完全可以以配置文件的参数传入。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值