jump to navigation

Java 6의 Scripting Language Support를 좀더 보자. 12월 20, 2006

Posted by yesjun in Open Source, Telling.
add a comment

스크립트가 실행되는 방식은,
해당 스크립트 엔진을 생성하는 Factory를 ScriptEngineManager 객체에게 요청하고,
Factory에서 해당 스크립트 엔진을 넘겨 받아 사용하는 방식이다.

ScriptEngineManager mgr = new ScriptEngineManager();
engine = mgr.getEngineByName("javascript");

현재 스크립트 매니져가 가지고 있는 엔진전체의 팩토리를 가져올 수도 있다.
List factories = mgr.getEngineFactories();

현재는 Mozilla Rhino 자바스크립트 엔진 밖에 없지만 추후 여러 언어로 추가 될것 같다.
ScriptEngineFactory Info
Script Engine: Mozilla Rhino (1.6 release 2)
Engine Alias: js
Engine Alias: rhino
Engine Alias: JavaScript
Engine Alias: javascript
Engine Alias: ECMAScript
Engine Alias: ecmascript
Language: ECMAScript (1.6)

사용은 마치 JavaScript나 PHP의 eval() 처럼 사용한다.
try {
jsEngine.eval("print('Hello, world!')");
} catch (ScriptException ex) {
ex.printStackTrace();
}

스크립트의 print() 함수는 Rhino 엔진에서 구현된 콘솔 출력 함수이다.
(JavaScript도 PHP나 Ruby 처럼 html에서 뿐만 아니라 다용도로 사용 가능하다)

java.io.Reader 를 사용한 예이다.

ScriptEngineManager engineMgr = new ScriptEngineManager();
ScriptEngine engine = engineMgr.getEngineByName("JavaScript");
InputStream is =
this.getClass().getResourceAsStream("/scripts/F1.js");
try {
Reader reader = new InputStreamReader(is);
engine.eval(reader);
} catch (ScriptException ex) {
ex.printStackTrace();
}

스크립트의 특정 함수를 호출할 수 있다.
jsEngine.eval("function sayHello() {" +
" print('Hello, world!');" +
"}");
Invocable invocableEngine = (Invocable) jsEngine;
invocableEngine.invokeFunction("sayHello");

자바 객체를 스크립트에서 쓸 수 있다.
List namesList = new ArrayList();
namesList.add("Jill");
namesList.add("Bob");
namesList.add("Laureen");
namesList.add("Ed");

jsEngine.put("namesListKey", namesList);
System.out.println("Executing in script environment...");
try {
jsEngine.eval("var x;" +
"var names = namesListKey.toArray();" +
"for(x in names) {" +
" println(names[x]);" +
"}" +
"namesListKey.add(\"Dana\");");
} catch (ScriptException ex) {
ex.printStackTrace();
}
System.out.println("Executing in Java environment...");
for (String name: namesList) {
System.out.println(name);
}

위의 코드 실행 결과는
Executing in script environment...
Jill
Bob
Laureen
Ed
Executing in Java environment...
Jill
Bob
Laureen
Ed
Dana

이상 간단한 소개는 마치고,
Invocable 인터페이스로 객체넘기는 방법과 스크립트에서 Java 패키지 import 하는 방법 등
자세한 내용은 아래 사이트에서 참고하면 된다.
Scripting for the Java Platform

자바에서 다른 스크립트 언어를 지원하다니…
이래서 Open Source (Sun이 완전한 Open Source 계열은 아니지만) 진영이 좋다.

MS도 VBscript가 있으니 한번 해볼만 할텐데…
다만 VBscript는 만든사람과, 예제코드 따라할 때만 사용한다는 소문이 있다.

Java SE 6 정식 릴리즈 되었다. 12월 20, 2006

Posted by yesjun in Open Source, Telling.
add a comment

Java 5의 기능도 제대로 사용 안한것 같은데, 벌써 6가 릴리즈 되다니…
이번에는 2년만의 버전업인데 개발이 상당히 빨랐던 것 같다.

기존 5가 오토박싱과 제네릭과 같은 언어적인 추가가 많이 이루어 졌다면,
이번 6는 성능향상과 웹개발을 위한 추가가 많이 이루어 진것 같다.

추가되는 기능을 간단히 정리하면,

  • New Security Features and Enhancements
  • Integrated Web Services
  • Scripting Language Support (JSR 223)
  • Enhanced Management and Serviceability
  • Increased Developer Productivity
  • Improved User Experience

특히 주목할 내용은 New Security Features and Enhancements 와 Scripting Language Support 인것 같다.

New Security Features and Enhancements를 보면,
GSS/Kerberos 등을 포함한 보안/인증 기능이 기본으로 포함된다.
더이상 보안 라이브러리 가져다 쓸필요도 없고 성능도 최적화 됐다.

Scripting Language Support를 보면,
JavaScript, PHP, Ruby, Phython 등을 자바에서 String 형식이나 java.io.Reader 를 통한 방법으로 사용할 수 있다.
물론 자바객체도 스크립트로 넘겨 직접 사용할 수 있게 해준다.

MS가 내년 Vista를 등에 업고 .NET 3.0 을 보급시키기려는 활발한 움직임에,
Sun도 급하긴 급했나보다.
Sun이 이렇게 빠른 움직임을 보이는 건 처음 봤다.