真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

字符串java代碼 java運行字符串代碼

java中怎么執(zhí)行字符串中的代碼

在javascript中eval()可以實現(xiàn)字符串轉(zhuǎn)代碼,java中需要使用動態(tài)編譯。

成都創(chuàng)新互聯(lián)是專業(yè)的松山網(wǎng)站建設(shè)公司,松山接單;提供成都網(wǎng)站設(shè)計、成都做網(wǎng)站,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進行松山網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!

把獲得的字符串寫入一個臨時文件中,然后編譯它,在調(diào)用其中的函數(shù)。

我們把要轉(zhuǎn)換的字符串構(gòu)造一個完整的類:如果方法是有返回值的.則:

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();

//動態(tài)編譯

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;

}

//調(diào)用temp的rt方法返回結(jié)果:

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] });

//如果方法沒有返回就直接調(diào)用

}

我們可以先寫好多個重載的eval,有返回值和沒有返回值的.以及可以傳遞參數(shù)的.

這樣我們就可以用字符串轉(zhuǎn)換為java的語句來執(zhí)行.

java字符串如何解析成能運行的java代碼?

java字符串如何解析成運行的java代碼

有些情況下,不得不動態(tài)運行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添加到當前字符串緩沖區(qū)的字符序列的末尾

②public StringBuffer insert(int offset,String str)在當前字符串緩沖區(qū)的字符序列的下標

索引offset插入str。如果offset等于舊長度,則str添加在字符串緩沖區(qū)的尾部

如圖所示

java統(tǒng)計串中字符個數(shù)的代碼解釋

整個代碼就是為了統(tǒng)計字符串中各個字符出現(xiàn)的個數(shù)

Map

result

=

getCharMaps(s);

這個方法調(diào)用

主要是看這個方法

public

static

Map

getCharMaps(String

s)

{

Map

map

=

new

HashMap();

//定義一個map

for(int

i

=

0;

i

s.length();

i++)

{

//

下面的代碼主要是循環(huán)字符串,一次取出每一個字符

Character

c

=

s.charAt(i);

//獲取對應(yīng)的字符

Integer

count

=

map.get(c);

//獲取字符對應(yīng)出現(xiàn)的次數(shù)

map.put(c,

count

==

null

?

1

:

count

+

1);

//如果之前出現(xiàn)過,則加1,否則直接賦1

}

return

map;

//返回最終的map

}

java中根據(jù)一段字符串,獲取其中的字母,有要求;求個具體代碼

要求1中要去掉所有數(shù)字,要求2、3中又要保留數(shù)字并進行翻譯,所以我兩種都寫了。具體代碼為:

public class Test {

public static void main(String args[]) {

String str = "0as2sw$#3Six";

System.out.println("原字符串:[" + str + "]");

System.out.println("");

//不翻譯數(shù)字

SetString set1 = new LinkedHashSet();

for (String s : str.split("[^A-Z a-z]")) {

if (s.length() 0) {

set1.add(s);

}

}

System.out.println("不翻譯數(shù)字的結(jié)果:" + set1);

System.out.println("");

?/*因為又要去除非字母和數(shù)字(以下簡稱去雜),又要將去雜結(jié)果分離成數(shù)字和字母,再翻譯數(shù)字,整個流程挺麻煩的,索性在去雜之前,先將數(shù)字翻譯成英文,為了使數(shù)字翻譯后的英文和原字符串的字母分開,在數(shù)字左右添加占位符#,這樣的話,形如:[a1b2c3]就會被處理為:[a#one#b#two#c#three#],這樣去雜后,就會被分割為:[a,one,b,two,c,three]了。這里定義了枚舉值English,用于實現(xiàn)0-9的英文映射,[10]不好映射成[ten],現(xiàn)在只能映射為[one,zero],如果按照題干非要映射為ten的話你再考慮考慮吧*/

for (English english : English.values()) {

str = str.replaceAll(english.getNum() + "", "#" + english.name() + "#");

}

System.out.println("將數(shù)字替換為“占位符 + 英文 + 占位符”的中間結(jié)果:[" + str + "]");

System.out.println("");

?//翻譯數(shù)字的結(jié)果

SetString set2 = new LinkedHashSet();

for (String s : str.split("[^A-Za-z]")) {

if (s.length() 0 ?) {

//判斷當前字符串是否是數(shù)字的英文,如果不是,就把它拆成單字母

if (mappingEnglish(s)){

set2.add(s);

}else {

for (char c : s.toCharArray()) {

set2.add(String.valueOf(c));

}

}

}

}

System.out.println("翻譯數(shù)字的結(jié)果:" + set2);

}

//判斷當前字符串是否是數(shù)字的英文

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;

}

}

}

我怕發(fā)出來代碼又擠在一起,順便也截個圖:

8-21行

22-50行

51-61行

62-85行完

運行結(jié)果:

如何將字符串轉(zhuǎn)換為java代碼

Java實現(xiàn)字符串轉(zhuǎn)換成可執(zhí)行代碼

使用commons的jexl可實現(xiàn)將字符串變成可執(zhí)行代碼的功能,我寫了一個類來封裝這個功能:

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;

/**

* 動態(tài)加載方法

*

*/

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);

}

}

調(diào)用

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運行字符串代碼
文章地址:http://weahome.cn/article/doocdpj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部