如何将字符串转换为java代码Java实现字符串转换成可执行代码
使用commons的jexl可实现将字符串变成可执行代码的功能 , 我写了一个类来封装这个功能:
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怎么把一段字符串当做代码来执行【java字符串生成代码 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随机生成字符串代码如下:
import java.util.Random;
public class Demo {
public static void main(String args[]){
Demo demo = new Demo();
System.out.println(demo.getRandomString(20));
}
public static String getRandomString(int length) {
StringBuffer buffer = new StringBuffer("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
StringBuffer sb = new StringBuffer();
Random random = new Random();
int range = buffer.length();
for (int i = 0; ilength; i) {
sb.append(buffer.charAt(random.nextInt(range)));
}
return sb.toString();
}
}
代码解读:
调用getRandomString()方法时的length参数为要返回的随机字符串的长度 。
StringBuffer buffer = new StringBuffer("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
此段字符串代表要出现的字符还可以是其他字符
如:-= *。.等等
java字符串如何解析成能运行的java代码?java字符串如何解析成运行java字符串生成代码的java代码
有些情况下,不得不动态运行Java代码,以便提供更加灵活的方式,以下代码可参考(在JDK 1.5 平台上运行通过)java字符串生成代码:
public static void main(String[] args) {
int i = 10;
String code = "System.out.println(\"Hello World!\" (13 2*5/3));";
code= "for(int i=0;i"i";i){";
code= " System.out.println(Math.pow(i,2));";
code= "}";
try {
run(code);
} catch (Exception e) {
e.printStackTrace();
}
}
private synchronized static File compile(String code) throws Exception {
File file = File.createTempFile("JavaRuntime", ".java", new File(System.getProperty("user.dir")));
file.deleteOnExit();
//获得类名
String classname = getBaseFileName(file);
//将代码输出到文件
PrintWriter out = new PrintWriter(new FileOutputStream(file));
out.println(getClassCode(code, classname));
out.close();
//编译生成的java文件
String[] cpargs = new String[] { "-d",
System.getProperty("user.dir")"\\WebRoot\\WEB-INF\\classes",
file.getName() };
int status = Main.compile(cpargs);
if (status != 0) {
throw new Exception("语法错误!");
}
return file;
}
private static synchronized void run(String code) throws Exception {
String classname = getBaseFileName(compile(code));
new File(System.getProperty("user.dir")
"\\WebRoot\\WEB-INF\\classes\\"classname".class")
.deleteOnExit();
try {
Class cls = Class.forName(classname);
Method main = cls.getMethod("method", null);
main.invoke(cls, null);
} catch (Exception se) {
se.printStackTrace();
}
}
private static String getClassCode(String code, String className) {
StringBuffer text = new StringBuffer();
text.append("public class "className"{\n");
text.append(" public static void method(){\n");
text.append(" "code"\n");
text.append(" }\n");
text.append("}");
return text.toString();
}
private static String getBaseFileName(File file) {
String fileName = file.getName();
int index = fileName.indexOf(".");
String result = "";
if (index != -1) {
result = fileName.substring(0, index);
} else {
result = fileName;
}
return result;
}
Java随机生成字符串代码如下java字符串生成代码,供参考java字符串生成代码:
import java.util.Random;
public class Main {
public static void main(String[] args) {
char[] chs = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};
String str = new Main().getStr(chs);
System.out.println(str);
}
public String getStr(char[] chs) {
String str = "";
Random random = new Random();
for (int i = 0; i4; i) {
// 这种写法易于扩展,chs内容改java字符串生成代码了不用修改代码
str= chs[random.nextInt(chs.length)];
}
str= random.nextInt(10);
return str;
}
}
java字符串怎么转换为代码方法是有的,但不全实际.
首先,你要理解,JAVA代码的运行是要被编译成字节码codebyte后才能被执行的,以你问题中的意思,那个字符串应该是在怎么代码被编译后项目在运行时,再传入的参数,这时,要想把传入参数的字符串当成JAVA代码来运行,只有一种办法,就是把传进来的字符串转换成字节码,并且,要虚拟加一个方法体出来.这也不是不可行,可用的技术有asm.cglib等字节码技术.但你想,对于你的问题.这样有实际的意义吗
你还不如,把system.out.print重定义成新的外调方法调动来的清晰
java字符串生成代码的介绍就聊到这里吧,感谢你花时间阅读本站内容 , 更多关于java字符串生成代码怎么用、java字符串生成代码的信息别忘了在本站进行查找喔 。
推荐阅读
- gis交通枢纽可达性,gis道路可达性分析
- 电脑钉钉在线直播怎么关闭,电脑钉钉在线直播怎么关闭声音
- 设备技术直播,直播设备行业
- oracle怎么实现缺省 oracle缺省安装后存在什么用户
- 虾皮电商如何主持,虾皮电商客服电话
- postgresql去重查询,plsql去重查询
- 卖男短袖衬衣直播话术,新手直播卖男装基本话术
- oracle补丁如何打 oracle补丁收费
- excel表格如何用公式,excel表格怎样用公式