想实现这样一种功能,好像很难的样子...
本帖最后由 hljt512 于 2013-10-10 16:33:24 编辑
比如说我有这么一段String:
asdsaf
${sql.list}asas
${rs.aaa}dfsdfsadfdf
${sql.end} sadsdaf
${fun()} sffasdfasdf
现在要做的是先把这段String读入,再开始分析,如果碰到${sql.list}这个字符串就开始执行java函数sql(),碰到${rs.aaa}就开始执行rs("aaa"),碰到${fun()}就执行fun(),大概是这么个需求..
如果用if来判断的话呢,应该很好解决,现在的要求是,不用if,因为这样效率不高,而且因为要执行的东西太多了,这样就会显得很乱,有没有别的方法,求各位帮忙,,
谢谢
------解决方案--------------------不用if更乱
正则比if效率还低
------解决方案--------------------楼上2位头像的舌头很搞笑。
------解决方案--------------------如果你不用if那么试试用正则,这个正则的作用就是把所有${}里面的字串匹配出来。
这个正则你可以在启动的时候编译放在那等用。
根据正则你应该得到一个列表,这个列表就是匹配出来的字串列表。
然后就是这些字串的解析了,解析成功利用反射去执行方法。
------解决方案--------------------一楼二楼都是吐舌头的
------解决方案-------------------- public static void main(String[] args) {
String str = "asdsaf${sql.list}asas${rs.aaa}dfsdfsadfdf${sql.end} sadsdaf ${fun()} sffasdfasdf";
Pattern pattern = Pattern.compile("\\$\\{([^.]+)\\.?(.*?)\\}");
Matcher m = pattern.matcher(str);
while(m.find()) {
String fun = m.group(1);
String paras = m.group(2);
if(paras!=null&&!paras.equals("")){
System.out.println(fun+"(\""+paras+"\")");
}else {
System.out.println(fun);
}
}
}
------解决方案--------------------如果碰到${sql.list}这个字符串就开始执行java函数sql(),碰到${rs.aaa}就开始执行rs("aaa")
-----------------------------------------------------
sql.list,方法是sql,不带参。rs.aaa,方法是rs,又把后面的当参数,你规则都不一样不写if怎么可能。
------解决方案--------------------
// 反射出元素类
Class<?> cls = Class.forName("className");
// 根据反射的元素类生成实例
Object obj = cls.newInstance();
//通过名字获取方法
Field field = null;
field = cls.getDeclaredField("methodName");
//注入参数,运行方法
field.set(obj,"value");