pooyanm
دوشنبه 11 اردیبهشت 1385, 07:10 صبح
من در این پست ویژگی جدیدی از Java 6 را با ذکر مثال معرفی می کنم و اگر فرصت پیش آمد به سایر قابلیت ها هم خواهم پرداخت. امیدوارم مفید واقع شود.
ویژگی دسترسی درون پردازشی (in-process) به compiler امکان جدیدی در نگارش 6 است که با توجه به اهمیت آن شاید کمی دیر به این زبان اضافه شد. این ویژگی امکان تولید bytecode های جاوا از درون ماشین مجازی در حال اجرا بدون نیاز به فراخوانی javac و ایجاد یک پردازش جداگانه را فراهم می کند. مهمترین مزیت این روش افزایش سرعت کمپایل IDE های جاوا و فریم ورک های JSP به میزان چند برابر سرعت فعلی آنهاست. در ادامه نحوه استفاده از این ویژگی با یک مثال آورده شده که در آن دو فایل جاوا، با این روش کمپایل می شود در مورد دومین فایل بدلیل اینکه همه منابع مورد نیاز در عملیات قبلی بوسیله ماشین مجازی cache شده اند سرعت کمپایل چند برابر بیشتر از قبلی است.
برای اجرا آن را در فایلی با نام Compiler.java ذخیره کرده سپس کامپایل و اجرا کنید. من از jdk-6-beta2-bin-b81-20_apr_2006 برای آن استفاده کردم در حالی که jdk-6_0-ea-bin-b40-09_jun_2005 که اواسط سال 2005 داونلود کردم دارای این قابلیت نیست.
جاوای 6 از این آدرس (تا الان بدون محدودیت برای ایران) قابل دریافت است: http://mustang.dev.java.net (http://mustang.dev.java.net/)
/*
* An example on how to use Java compiler API, available
* in Java SE 6 (currently in beta).
*
* based on: http://download.java.net/jdk6/docs/api/javax/tools/JavaCompilerTool.html
*
*/
import javax.tools.*;
import java.io.*;
import java.util.*;
public class Compiler {
private JavaCompilerTool compiler;
private StandardJavaFileManager javaFileManager;
public static void main(String[] args) throws Exception {
Compiler c = new Compiler();
c.compile(new File("e:\\CompilerTest.java"));
// reuse the same file manager to allow caching of jar files
c.compile(new File("e:\\CompilerTest2.java"));
c.getStandardJavaFileManager().close();
}
public Compiler() {
compiler = ToolProvider.getSystemJavaCompilerTool();
javaFileManager = compiler.getStandardFileManager(null);
}
public StandardJavaFileManager getStandardJavaFileManager() {
return javaFileManager;
}
public void compile(File file) {
System.out.println("Wait, Compiling...");
Vector<String> options = new Vector<String>();
String cp = System.getProperty("java.class.path");
cp += ";c:\\clspath\\"; // append your own class-path
options.add("-cp");
options.add(cp);
options.add("-Xlint:all");
System.out.println(" javac " + file.getName());
Iterable<? extends JavaFileObject> compilationUnits = javaFileManager.getJavaFileObjectsFromFiles(
Arrays.asList(new File[] {file})
);
JavaCompilerTool.CompilationTask compilationTask = compiler.getTask(
null,
javaFileManager,
null,
options,
null,
compilationUnits
);
compilationTask.run();
System.out.println(
compilationTask.getResult() ?
" Successfully Compiled." :
" Errors occurred during compiling..."
);
System.out.println();
}
}
ویژگی دسترسی درون پردازشی (in-process) به compiler امکان جدیدی در نگارش 6 است که با توجه به اهمیت آن شاید کمی دیر به این زبان اضافه شد. این ویژگی امکان تولید bytecode های جاوا از درون ماشین مجازی در حال اجرا بدون نیاز به فراخوانی javac و ایجاد یک پردازش جداگانه را فراهم می کند. مهمترین مزیت این روش افزایش سرعت کمپایل IDE های جاوا و فریم ورک های JSP به میزان چند برابر سرعت فعلی آنهاست. در ادامه نحوه استفاده از این ویژگی با یک مثال آورده شده که در آن دو فایل جاوا، با این روش کمپایل می شود در مورد دومین فایل بدلیل اینکه همه منابع مورد نیاز در عملیات قبلی بوسیله ماشین مجازی cache شده اند سرعت کمپایل چند برابر بیشتر از قبلی است.
برای اجرا آن را در فایلی با نام Compiler.java ذخیره کرده سپس کامپایل و اجرا کنید. من از jdk-6-beta2-bin-b81-20_apr_2006 برای آن استفاده کردم در حالی که jdk-6_0-ea-bin-b40-09_jun_2005 که اواسط سال 2005 داونلود کردم دارای این قابلیت نیست.
جاوای 6 از این آدرس (تا الان بدون محدودیت برای ایران) قابل دریافت است: http://mustang.dev.java.net (http://mustang.dev.java.net/)
/*
* An example on how to use Java compiler API, available
* in Java SE 6 (currently in beta).
*
* based on: http://download.java.net/jdk6/docs/api/javax/tools/JavaCompilerTool.html
*
*/
import javax.tools.*;
import java.io.*;
import java.util.*;
public class Compiler {
private JavaCompilerTool compiler;
private StandardJavaFileManager javaFileManager;
public static void main(String[] args) throws Exception {
Compiler c = new Compiler();
c.compile(new File("e:\\CompilerTest.java"));
// reuse the same file manager to allow caching of jar files
c.compile(new File("e:\\CompilerTest2.java"));
c.getStandardJavaFileManager().close();
}
public Compiler() {
compiler = ToolProvider.getSystemJavaCompilerTool();
javaFileManager = compiler.getStandardFileManager(null);
}
public StandardJavaFileManager getStandardJavaFileManager() {
return javaFileManager;
}
public void compile(File file) {
System.out.println("Wait, Compiling...");
Vector<String> options = new Vector<String>();
String cp = System.getProperty("java.class.path");
cp += ";c:\\clspath\\"; // append your own class-path
options.add("-cp");
options.add(cp);
options.add("-Xlint:all");
System.out.println(" javac " + file.getName());
Iterable<? extends JavaFileObject> compilationUnits = javaFileManager.getJavaFileObjectsFromFiles(
Arrays.asList(new File[] {file})
);
JavaCompilerTool.CompilationTask compilationTask = compiler.getTask(
null,
javaFileManager,
null,
options,
null,
compilationUnits
);
compilationTask.run();
System.out.println(
compilationTask.getResult() ?
" Successfully Compiled." :
" Errors occurred during compiling..."
);
System.out.println();
}
}