java字符串轉(zhuǎn)代碼6的簡單介紹
Java字符串轉(zhuǎn)為字符
代碼如下:
import?java.util.Arrays;
import?java.util.Scanner;
public?class?App?{
public?static?void?main(String[]?args)?{
Scanner?scanner?=?new?Scanner(System.in);
//?1.鍵盤錄入一個(gè)字符串
String?str?=?scanner.nextLine();
char[]?chars?=?new?char[str.length()];
//?2.將該字符串變成字符數(shù)組(不能使用toCharArray()方法)
for?(int?i?=?0;?i??str.length();?i++)?{
char?ch?=?str.charAt(i);
//?5.將字符數(shù)組中索引為偶數(shù)的元素變成'~'
ch?=?(i?%?2?==?0)???'~'?:?ch;
//?3.將字符數(shù)組中的所有大寫字母變成小寫字母(不能使用toLowerCase()方法晌段)
ch?扒謹(jǐn)碰=?(ch?=?'A'??ch?=?'Z')???(char)(ch?-?32)?:?ch;
chars[i]?=?ch;
}
//?4.如果第一位和最后一位的內(nèi)容不相同,則交換
if?(chars[0]?!=?chars[chars.length?-?1])?{
char?ch?=?chars[0];
chars[0]?=?chars[chars.length?-?1];
chars[chars.length?春談-?1]?=?ch;
}
//?6.打印數(shù)組元素的內(nèi)容
System.out.println(Arrays.toString(chars));
}
}
如何用maven將java8寫的代碼編譯為java6平臺的
在一般的Java應(yīng)用開發(fā)過程中,開發(fā)人員使用Java的方式比較簡單。打開慣用的IDE,編寫Java源代碼,再利用IDE提供的功能直接運(yùn)行Java 程序就可以了。這種開發(fā)模式背后的過程是:開發(fā)人員編寫的是Java源代碼文件(.java),IDE會負(fù)責(zé)調(diào)用Java的編譯器把Java源代碼編譯成平臺無關(guān)的字節(jié)代碼(byte code),以類文件的形式滲談老保存在磁盤上(.class)。Java虛擬機(jī)(JVM)會負(fù)責(zé)把Java字節(jié)代碼加載并執(zhí)行。Java通過這種方式來實(shí)現(xiàn)其“編寫一次,到處運(yùn)行(Write once, run anywhere)” 的目標(biāo)。Java類文件中包含的字節(jié)代碼可以被不同平臺上的JVM所使用。Java字節(jié)代碼不僅可以以文件形式存在于磁盤上,也可以通過網(wǎng)絡(luò)方式來下載,還可以只存在于內(nèi)存中。JVM中的類加載器會負(fù)責(zé)從包含字節(jié)代碼的字節(jié)數(shù)組(byte[])中定義出Java類。在某些情況下,可能會需要動態(tài)的生成 Java字節(jié)叢升代碼,或是對已有的Java字節(jié)代碼進(jìn)行修改。這個(gè)時(shí)候就需要用到本文中將要介紹的相關(guān)技術(shù)。首先介紹一下如何動態(tài)編譯Java源文件。
動態(tài)編譯Java源文件
在一般情況下,開發(fā)人員都是在程序運(yùn)行之前就編寫完成了全部的Java源代碼并且成功編譯。對有些應(yīng)用來說,Java源代碼的內(nèi)容在運(yùn)行時(shí)刻才能確定。這個(gè)時(shí)候就需要動態(tài)編譯源代碼來生成Java字節(jié)代碼,再由JVM來加載執(zhí)行。典型的場景是很多算法競賽的在線評測系統(tǒng)(如PKU JudgeOnline),允許用戶上傳Java代碼,由系統(tǒng)在后臺編譯、運(yùn)行并進(jìn)行判定。侍友在動態(tài)編譯Java源文件時(shí),使用的做法是直接在程序中調(diào)用Java編譯器。
JSR 199引入了Java編譯器API。如果使用JDK 6的話,可以通過此API來動態(tài)編譯Java代碼。比如下面的代碼用來動態(tài)編譯最簡單的Hello World類。該Java類的代碼是保存在一個(gè)字符串中的。
01 public class CompilerTest {
02 public static void main(String[] args) throws Exception {
03 String source = "public class Main { public static void main(String[] args) {System.out.println(\"Hello World!\");} }";
04 JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
05 StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
06 StringSourceJavaObject sourceObject = newCompilerTest.StringSourceJavaObject("Main", source);
07 Iterable extends JavaFileObject fileObjects = Arrays.asList(sourceObject);
08 CompilationTask task = compiler.getTask(null, fileManager, null,null, null, fileObjects);
09 boolean result = task.call();
10 if (result) {
11 System.out.println("編譯成功。");
12 }
13 }
14
15 static class StringSourceJavaObject extends SimpleJavaFileObject {
16
17 private String content = null;
18 public StringSourceJavaObject(String name, String content) ??throwsURISyntaxException {
19 super(URI.create("string:///" + name.replace('.','/') + Kind.SOURCE.extension), Kind.SOURCE);
20 this.content = content;
21 }
22
23 public CharSequence getCharContent(boolean ignoreEncodingErrors) ??throws IOException {
24 return content;
25 }
26 }
27 }
如果不能使用JDK 6提供的Java編譯器API的話,可以使用JDK中的工具類com.sun.tools.javac.Main,不過該工具類只能編譯存放在磁盤上的文件,類似于直接使用javac命令。
另外一個(gè)可用的工具是Eclipse JDT Core提供的編譯器。這是Eclipse Java開發(fā)環(huán)境使用的增量式Java編譯器,支持運(yùn)行和調(diào)試有錯誤的代碼。該編譯器也可以單獨(dú)使用。Play框架在內(nèi)部使用了JDT的編譯器來動態(tài)編譯Java源代碼。在開發(fā)模式下,Play框架會定期掃描項(xiàng)目中的Java源代碼文件,一旦發(fā)現(xiàn)有修改,會自動編譯 Java源代碼。因此在修改代碼之后,刷新頁面就可以看到變化。使用這些動態(tài)編譯的方式的時(shí)候,需要確保JDK中的tools.jar在應(yīng)用的 CLASSPATH中。
下面介紹一個(gè)例子,是關(guān)于如何在Java里面做四則運(yùn)算,比如求出來(3+4)*7-10的值。一般的做法是分析輸入的運(yùn)算表達(dá)式,自己來模擬計(jì)算過程??紤]到括號的存在和運(yùn)算符的優(yōu)先級等問題,這樣的計(jì)算過程會比較復(fù)雜,而且容易出錯。另外一種做法是可以用JSR 223引入的腳本語言支持,直接把輸入的表達(dá)式當(dāng)做JavaScript或是JavaFX腳本來執(zhí)行,得到結(jié)果。下面的代碼使用的做法是動態(tài)生成Java源代碼并編譯,接著加載Java類來執(zhí)行并獲取結(jié)果。這種做法完全使用Java來實(shí)現(xiàn)。
01 private static double calculate(String expr) throws CalculationException {
02 String className = "CalculatorMain";
03 String methodName = "calculate";
04 String source = "public class " + className
05 + " { public static double " + methodName + "() { return " + expr +"; } }";
06 //省略動態(tài)編譯Java源代碼的相關(guān)代碼,參見上一節(jié)
07 boolean result = task.call();
08 if (result) {
09 ClassLoader loader = Calculator.class.getClassLoader();
10 try {
11 Class? clazz = loader.loadClass(className);
12 Method method = clazz.getMethod(methodName, new Class?[] {});
13 Object value = method.invoke(null, new Object[] {});
14 return (Double) value;
15 } catch (Exception e) {
16 throw new CalculationException("內(nèi)部錯誤。");
17 }
18 } else {
19 throw new CalculationException("錯誤的表達(dá)式。");
20 }
21 }
上面的代碼給出了使用動態(tài)生成的Java字節(jié)代碼的基本模式,即通過類加載器來加載字節(jié)代碼,創(chuàng)建Java類的對象的實(shí)例,再通過Java反射API來調(diào)用對象中的方法。
Java字節(jié)代碼增強(qiáng)
Java 字節(jié)代碼增強(qiáng)指的是在Java字節(jié)代碼生成之后,對其進(jìn)行修改,增強(qiáng)其功能。這種做法相當(dāng)于對應(yīng)用程序的二進(jìn)制文件進(jìn)行修改。在很多Java框架中都可以見到這種實(shí)現(xiàn)方式。Java字節(jié)代碼增強(qiáng)通常與Java源文件中的注解(annotation)一塊使用。注解在Java源代碼中聲明了需要增強(qiáng)的行為及相關(guān)的元數(shù)據(jù),由框架在運(yùn)行時(shí)刻完成對字節(jié)代碼的增強(qiáng)。Java字節(jié)代碼增強(qiáng)應(yīng)用的場景比較多,一般都集中在減少冗余代碼和對開發(fā)人員屏蔽底層的實(shí)現(xiàn)細(xì)節(jié)上。用過JavaBeans的人可能對其中那些必須添加的getter/setter方法感到很繁瑣,并且難以維護(hù)。而通過字節(jié)代碼增強(qiáng),開發(fā)人員只需要聲明Bean中的屬性即可,getter/setter方法可以通過修改字節(jié)代碼來自動添加。用過JPA的人,在調(diào)試程序的時(shí)候,會發(fā)現(xiàn)實(shí)體類中被添加了一些額外的 域和方法。這些域和方法是在運(yùn)行時(shí)刻由JPA的實(shí)現(xiàn)動態(tài)添加的。字節(jié)代碼增強(qiáng)在面向方面編程(AOP)的一些實(shí)現(xiàn)中也有使用。
java unicode 轉(zhuǎn)字符串,如下:["6\u621610\u621612"]轉(zhuǎn)String
直接運(yùn)行下面這段代汪櫻碼就是你要的結(jié)果,那個(gè)str跟你的那個(gè)str是一樣的,不過在代碼巖辯里面要轉(zhuǎn)義,否則報(bào)錯,如果是變粗陵缺量接收,直接傳就行了
public static void main(String[] args) {
Pattern pattern1 = Pattern點(diǎn)抗pile("(?=\\[)[^\\]]+");
String str="[\"6\u621610\u621612\"]";
Matcher m = pattern1.matcher(str);
while (m.find()) {
System.out.println(m.group());
}
}
上一篇:Java結(jié)束進(jìn)程樹代碼 java怎么結(jié)束運(yùn)行
欄 目:Java編程
下一篇:沒有了
本文標(biāo)題:java字符串轉(zhuǎn)代碼6的簡單介紹
本文地址:http://mengdiqiu.com.cn/a1/Javabiancheng/17410.html
您可能感興趣的文章
- 04-13Java結(jié)束進(jìn)程樹代碼 java怎么結(jié)束運(yùn)行
- 04-13java重置按鈕的代碼 java重置按鈕代碼jsp
- 04-13java圖片上傳方法代碼 java上傳圖片到tomcat
- 04-13點(diǎn)擊按鈕的java代碼 點(diǎn)擊按鈕的java代碼是什么
- 04-12包含局域網(wǎng)聊天java代碼6的詞條
- 04-12java代碼塊嵌套幾層 java代碼塊嵌套不超過幾層
- 04-12java程序代碼成績表 用java編寫成績
- 04-12java中隨機(jī)代碼 java隨機(jī)函數(shù)怎么寫
- 04-12java求梯形面積代碼 java輸出一個(gè)梯形
- 04-12圖片如何上傳java代碼 java圖片文件上傳


閱讀排行
本欄相關(guān)
- 04-13java字符串轉(zhuǎn)代碼6的簡單介紹
- 04-13Java結(jié)束進(jìn)程樹代碼 java怎么結(jié)束運(yùn)行
- 04-13java重置按鈕的代碼 java重置按鈕代碼
- 04-13java圖片上傳方法代碼 java上傳圖片到
- 04-13點(diǎn)擊按鈕的java代碼 點(diǎn)擊按鈕的java代
- 04-12包含局域網(wǎng)聊天java代碼6的詞條
- 04-12java代碼塊嵌套幾層 java代碼塊嵌套不
- 04-12java程序代碼成績表 用java編寫成績
- 04-12java中隨機(jī)代碼 java隨機(jī)函數(shù)怎么寫
- 04-12java求梯形面積代碼 java輸出一個(gè)梯形
隨機(jī)閱讀
- 01-10Phpcms v9 欄目列表選擇性調(diào)用數(shù)據(jù)具體
- 01-10Delphi 實(shí)現(xiàn)軟件自動升級的功能
- 01-11帝國CMS7.0IIS偽靜態(tài)設(shè)置教程
- 01-10編譯錯誤error: stray ‘\343’in program的
- 01-11帝國CMS功能解密之字段處理函數(shù)詳解
- 01-10關(guān)于腳本調(diào)用外部對像和類型庫
- 01-10浮點(diǎn)數(shù)在計(jì)算機(jī)中存儲方式是怎樣的
- 01-10c語言中static的用法詳細(xì)示例分析
- 08-05DEDECMS文章被評論后發(fā)短消息給作者的
- 01-10c++實(shí)現(xiàn)二叉查找樹示例