如何将字符串转换为java代码Java实现字符串转换成可执行代码
使用commons的jexl可实现将字符串变成可执行代码的功能字符串java代码,字符串java代码我写字符串java代码了一个类来封装这个功能字符串java代码:
import java.util.Map;
import org.apache.commons.jexl2.Expression;
import org.apache.commons.jexl2.JexlContext;
import org.apache.commons.jexl2.JexlEngine;
import org.apache.commons.jexl2.MapContext;
/**
* 动态加载方法
*
*/
public class DyMethodUtil {
public static Object invokeMethod(String jexlExp,MapString,Object map){
JexlEngine jexl=new JexlEngine();
Expression e = jexl.createExpression(jexlExp);
JexlContext jc = new MapContext();
for(String key:map.keySet()){
jc.set(key, map.get(key));
}
if(null==e.evaluate(jc)){
return "";
}
return e.evaluate(jc);
}
}
调用
MapString,Object map=new HashMapString,Object();
map.put("testService",testService);
map.put("person",person);
String expression="testService.save(person)";
DyMethodUtil.invokeMethod(expression,map);
java中怎么执行字符串中的代码在javascript中eval()可以实现字符串转代码,java中需要使用动态编译 。
把获得的字符串写入一个临时文件中,然后编译它,在调用其中的函数 。
我们把要转换的字符串构造一个完整的类:如果方法是有返回值的.则:
public object eval(string str){
//生成java文件
string s = "class temp{";
s= "object rt(){"
s= "myclass mc = new myclass();"
s= " return mc." str "();";
s= "}"
s="}";
file f = new file("temp.java");
printwriter pw = new printwriter(new filewriter(f));
pw.println(s);
pw.close();
//动态编译
com.sun.tools.javac.main javac = new com.sun.tools.javac.main();
string[] cpargs = new string[] {"-d", "所在目录","temp.java"};
int status = javac.compile(cpargs);
if(status!=0){
system.out.println("没有成功编译源文件!");
return null;
}
//调用temp的rt方法返回结果:
myclassloader mc = new myclassloader();
class clasz = mc.loadclass("test.class",true);
method rt = clasz.getmethod("rt", new class[]{ string[].class });
return rt.invoke(null, new object[] { new string[0] });
//如果方法没有返回就直接调用
}
我们可以先写好多个重载的eval,有返回值和没有返回值的.以及可以传递参数的.
这样我们就可以用字符串转换为java的语句来执行.
java中根据一段字符串 , 获取其中的字母 , 有要求;求个具体代码要求1中要去掉所有数字,要求2、3中又要保留数字并进行翻译,所以我两种都写了 。具体代码为:
public class Test {
public static void main(String args[]) {
String str = "0as2sw$#3Six";
System.out.println("原字符串:["str"]");
System.out.println("");
//不翻译数字
SetString set1 = new LinkedHashSet();
for (String s : str.split("[^A-Z a-z]")) {
if (s.length()0) {
set1.add(s);
}
}
System.out.println("不翻译数字的结果:"set1);
System.out.println("");
/*因为又要去除非字母和数字(以下简称去杂),又要将去杂结果分离成数字和字母 , 再翻译数字,整个流程挺麻烦的,索性在去杂之前,先将数字翻译成英文 , 为了使数字翻译后的英文和原字符串的字母分开 , 在数字左右添加占位符#,这样的话,形如:[a1b2c3]就会被处理为:[a#one#b#two#c#three#] , 这样去杂后,就会被分割为:[a,one,b,two,c,three]了 。这里定义了枚举值English,用于实现0-9的英文映射,[10]不好映射成[ten],现在只能映射为[one,zero] , 如果按照题干非要映射为ten的话你再考虑考虑吧*/
for (English english : English.values()) {
str = str.replaceAll(english.getNum()"", "#"english.name()"#");
}
System.out.println("将数字替换为“占位符英文占位符”的中间结果:["str"]");
System.out.println("");
//翻译数字的结果
SetString set2 = new LinkedHashSet();
for (String s : str.split("[^A-Za-z]")) {
if (s.length()0) {
//判断当前字符串是否是数字的英文 , 如果不是,就把它拆成单字母
if (mappingEnglish(s)){
set2.add(s);
}else {
for (char c : s.toCharArray()) {
set2.add(String.valueOf(c));
}
}
}
}
System.out.println("翻译数字的结果:"set2);
}
//判断当前字符串是否是数字的英文
private static boolean mappingEnglish(String str) {
for (English english : English.values()) {
str = str.toLowerCase();
if (english.name().equals(str)) {
return true;
}
}
return false;
}
enum English {
zero(0),
one(1),
two(2),
three(3),
four(4),
five(5),
six(6),
seven(7),
eight(8),
nine(9);
private int num;
public int getNum() {
return num;
}
English(int num) {
this.num = num;
}
}
}
我怕发出来代码又挤在一起,顺便也截个图:
8-21行
22-50行
51-61行
62-85行完
运行结果:
【字符串java代码 字符串方法java】字符串java代码的介绍就聊到这里吧 , 感谢你花时间阅读本站内容,更多关于字符串方法java、字符串java代码的信息别忘了在本站进行查找喔 。
推荐阅读
- 直播公司运营成本,直播公司运营成本包括哪些
- 电脑怎么截图到淘宝上买,淘宝网购物怎样截图
- 如何改善电商交易风险,如何防范电子商务交易风险
- 区块链扩容视频讲解,区块链链改方案
- oracle怎么判断周末 oracle判断日期是否为工作日
- asp.net调用active,aspnet ui
- 包含开通视频号小店类目保证金的词条
- 安卓4gios7刷机包,安卓70刷机包
- Python函数中sub python函数中最多只有一个return语句