字符串java代码 java运行字符串代码

java中怎么执行字符串中的代码

在javascript中eval()可以实现字符串转代码,java中需要使用动态编译。

成都创新互联是专业的松山网站建设公司,松山接单;提供成都网站设计、成都做网站,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行松山网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!

把获得的字符串写入一个临时文件中,然后编译它,在调用其中的函数。

我们把要转换的字符串构造一个完整的类:如果方法是有返回值的.则:

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字符串如何解析成能运行的java代码?

java字符串如何解析成运行的java代码

有些情况下,不得不动态运行Java代码,以便提供更加灵活的方式,以下代码可参考(在JDK 1.5+平台上运行通过):

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代码拼接字符串的几种方式

String类的方法:

①利用运算符"+"

②public String concat(String str)进行字符串的拼接操作

StringBuffer的方法:

①public StringBuffer append(String str)将str添加到当前字符串缓冲区的字符序列的末尾

②public StringBuffer insert(int offset,String str)在当前字符串缓冲区的字符序列的下标

索引offset插入str。如果offset等于旧长度,则str添加在字符串缓冲区的尾部

如图所示

java统计串中字符个数的代码解释

整个代码就是为了统计字符串中各个字符出现的个数

Map

result

=

getCharMaps(s);

这个方法调用

主要是看这个方法

public

static

Map

getCharMaps(String

s)

{

Map

map

=

new

HashMap();

//定义一个map

for(int

i

=

0;

i

s.length();

i++)

{

//

下面的代码主要是循环字符串,一次取出每一个字符

Character

c

=

s.charAt(i);

//获取对应的字符

Integer

count

=

map.get(c);

//获取字符对应出现的次数

map.put(c,

count

==

null

?

1

:

count

+

1);

//如果之前出现过,则加1,否则直接赋1

}

return

map;

//返回最终的map

}

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实现字符串转换成可执行代码

使用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运行字符串代码
标题URL:http://bzwzjz.com/article/doocdpj.html

其他资讯

Copyright © 2007-2020 广东宝晨空调科技有限公司 All Rights Reserved 粤ICP备2022107769号
友情链接: 成都网站设计 成都网站设计 H5网站制作 网站建设公司 成都网站建设公司 成都响应式网站建设 成都网站建设 成都网站建设公司 重庆企业网站建设 成都网站设计 响应式网站设计 成都网站设计公司 成都网站建设 成都网站建设公司 网站设计制作 商城网站建设 企业网站建设公司 成都网站制作 四川成都网站建设 自适应网站建设 专业网站设计 网站制作公司