大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節(jié)點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 Java編譯器哪個好

Java編譯器哪個好

更新時間:2021-05-26 15:49:52 來源:動力節(jié)點 瀏覽911次

Java編譯器哪個好?API就是非常不錯的,Java編譯器讀取源文件并生成類文件。(將它們組裝到JAR,WAR,EAR和其他軟件包中是另一種工具的責任。)源文件和類文件不一定是駐留在磁盤,SSD或內(nèi)存驅(qū)動器中的真實操作系統(tǒng)文件。畢竟,當涉及到運行時API時,Java通常對于抽象是很好的,現(xiàn)在就是這種情況。這些文件是一些“抽象”文件,您必須通過API提供訪問這些文件,這些文件可以是磁盤文件,但同時幾乎可以是任何其他文件。將源代碼保存到磁盤上只是為了讓編譯器在同一進程中運行以將其讀回并在類文件準備好后對其進行相同操作,通常會浪費資源。

Java編譯器作為運行時可用的API,要求您提供一些簡單的API(或您喜歡的SPI)來訪問源代碼并發(fā)送生成的字節(jié)碼。如果我們在內(nèi)存中有代碼,則可以有以下代碼:

public Class<?> compile(String sourceCode, String canonicalClassName)
			throws Exception {
		JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
		List<JavaSourceFromString> sources = new LinkedList<>();
		String className = calculateSimpleClassName(canonicalClassName);
		sources.add(new JavaSourceFromString(className, sourceCode));
 
		StringWriter sw = new StringWriter();
		MemoryJavaFileManager fm = new MemoryJavaFileManager(
				compiler.getStandardFileManager(null, null, null));
		JavaCompiler.CompilationTask task = compiler.getTask(sw, fm, null,
				null, null, sources);
 
		Boolean compilationWasSuccessful = task.call();
		if (compilationWasSuccessful) {
			ByteClassLoader byteClassLoader = new ByteClassLoader(new URL[0],
					classLoader, classesByteArraysMap(fm));
 
			Class<?> klass = byteClassLoader.loadClass(canonicalClassName);
			byteClassLoader.close();
			return klass;
		} else {
			compilerErrorOutput = sw.toString();
			return null;
		}
	}

編譯器實例可通過ToolProvider并且要創(chuàng)建編譯任務(wù),我們必須調(diào)用getTask()。該代碼通過字符串編寫器將錯誤寫入字符串。文件管理器(fm)是在同一程序包中實現(xiàn)的,它只是將文件作為字節(jié)數(shù)組存儲在映射中,其中的鍵是“文件名”。這是類加載器稍后在加載類時將獲取字節(jié)的位置。該代碼未提供任何可診斷的偵聽器(請參見RT中Java編譯器的文檔),編譯器選項或注釋處理器要處理的類。這些都是空值。最后一個參數(shù)是要編譯的源代碼列表。我們僅在此工具中編譯一個類,但是由于編譯器API是通用的并且需要可迭代的源,因此我們提供了一個列表。由于存在另一個抽象級別,因此此列表包含JavaSourceFromString。

要開始編譯,必須“調(diào)用”創(chuàng)建的任務(wù),如果編譯成功,則從生成的一個或多個字節(jié)數(shù)組中加載類。請注意,如果在我們編譯的頂級類中有嵌套類或內(nèi)部類,則編譯器將創(chuàng)建幾個類。這就是為什么即使只編譯一個源類,我們也必須維護類的整個映射,而不是單個字節(jié)數(shù)組。如果編譯不成功,則錯誤輸出將存儲在一個字段中并可以查詢。

該類的使用非常簡單,您可以在單元測試中找到示例:

private String loadJavaSource(String name) throws IOException {
		InputStream is = this.getClass().getResourceAsStream(name);
		byte[] buf = new byte[3000];
		int len = is.read(buf);
		is.close();
		return new String(buf, 0, len, "utf-8");
	}
...
	@Test
	public void given_PerfectSourceCodeWithSubClasses_when_CallingCompiler_then_ProperClassIsReturned()
			throws Exception {
		final String source = loadJavaSource("Test3.java");
		Compiler compiler = new Compiler();
		Class<?> newClass = compiler.compile(source, "com.javax0.jscc.Test3");
		Object object = newClass.newInstance();
		Method f = newClass.getMethod("method");
		int i = (int) f.invoke(object, null);
		Assert.assertEquals(1, i);
	}

以上就是動力節(jié)點小編介紹的"Java編譯器哪個好",希望對大家有幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為您服務(wù)。

提交申請后,顧問老師會電話與您溝通安排學(xué)習(xí)

免費課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 久久精品日日躁夜夜躁欧美 | 色偷偷亚洲精品一区二区 | 性做久久久久久久久25的美女 | 国产精品21区 | 毛片色毛片18毛片美女 | 精品午夜寂寞影院在线观看 | 天天射夜夜骑 | 婷婷色基地| 国产欧美亚洲三区久在线观看 | 神马我不卡在线观看 | 欧美一级欧美三级在线观看 | 爱爱永久免费视频网站 | 一级特黄a免费大片 | 9999人体做爰大胆视频 | 91久久九九精品国产综合 | 国产精品不卡在线 | 亚洲国产精品一区二区久久 | 加勒比一本大道在线 | 麻豆成人久久精品二区三区小说 | 神马我不卡在线观看 | 久久精品视频免费看 | 色噜噜狠狠狠狠色综合久一 | 日本一区二区三区久久 | 亚洲精品一二三区-久久 | 国产ar高清视频+视频 | 国产情侣偷国语对白 | 国产一区二区在线观看免费 | 亚洲最大成人综合网 | 国产精品一区高清在线观看 | 欧美成人毛片在线视频 | 久久网精品视频 | 国产精品视频免费视频 | 免费二区| 中文日本在线 | 国产a不卡片精品免费观看 国产a高清 | 最新国产福利片在线观看 | 国产中文字幕视频在线观看 | 精品国产一区二区三区久 | 亚洲欧美一区二区三区综合 | 五月天婷婷在线视频国产在线 | 26uuu欧美视频在线观看 |