SlideShare a Scribd company logo
1 of 49
JDK 7 출시 기념 (2011.7)JDK 7 소개 #5 invokedynamic,[object Object],김용환,[object Object],knight76.tistory.com,[object Object],Knight76 at gmail.com,[object Object],1,[object Object]
좋은 레퍼런스,[object Object],http://java.sun.com/developer/technicalArticles/DynTypeLang/index.html,[object Object],http://androidkr.blogspot.com/2010_07_01_archive.html,[object Object],http://cr.openjdk.java.net/~jrose/pres/200906-Cookbook.pdf,[object Object],http://download.oracle.com/javase/7/docs/technotes/guides/vm/multiple-language-support.html,[object Object],Jsr문서,[object Object],dynamically_typed_lang-jdk7-final-oth-JSpecndex.html,[object Object]
For Who,[object Object],JAVA 1.6부터 다른 언어를 지원 (Rhino),[object Object],정적 타입 언어 (非 자바)를 jvm에서 안정적이고, 빨리 실행시켜줄 수 있도록 지원 요청,[object Object]
Java language / JVM,[object Object],Java language 는 JVM과 다르다.,[object Object],특징,[object Object],Java compiler,[object Object],사람이 write한 java code를 JVM에서 실행가능하도록byte 코드를 생성,[object Object],HelloWorld.java -> HellowWorld.class,[object Object],Java Virtual Machine,[object Object], byte코드와 class 파일 포맷을 가지고 실행,[object Object],HellowWorld.class -> 실행,[object Object],이슈,[object Object],Java language 이슈가 아닌…,[object Object],정적 타입 언어를 바로 JVM 상에서 돌아가는 것 자체가 어려움 (interoperability),[object Object],JVM (java virtual machine)의 실행 속도 이슈! (performance),[object Object]
기존 사례,[object Object],Groovy 코드 -> class로 컴파일  -> JVM실행,[object Object],JRuby코드 -> class로컴파일   (spring의 JRubyScriptUtils.createJRubyObject메소드) -> JVM 실행,[object Object],단점,[object Object],JVM에서 돌아갈 수 있도록 작업을 많이 해야 했음. JVM dependent code가 많았음,[object Object]
둘의장점을 이용,[object Object],Ruby/Python,[object Object],(Dynamic Language),[object Object],JVM 특징,[object Object],(고성능, 재활용, ,[object Object],JIT, GC, ,[object Object],다양한 OS 지원),[object Object]
But, 이슈,[object Object],동적언어와 정적 언어 특징,[object Object],정적 타입 언어(java)는Compile 레벨에서 Type Checking이 엄격하게 이루어짐,[object Object],동적 타입 언어(dynamic type)는 Type Checking이 Runtime때 실행. 변수는 어떤 타입이든지 상관없음 (javascript, ruby, python..),[object Object]
JVM 이슈 : 메소드,[object Object],JVM 이슈 : 메소드,[object Object],동적언어에서는메소드의파라미터 타입을 굳이 알 수 않아도 되지만, JVM은 byte code 명령어들을 이용하기 위해서 method, method안의 클래스 타입, descriptor 형식이 필요,[object Object], function max (x,y) {,[object Object],      if x.lessThan(y) then y else x,[object Object], } ,[object Object],동적언어메소드파라미터의 타입정보가 없는 메소드,[object Object]
구현,[object Object],타입 정보가 없으면, reflection API를이용해서 java.lang.reflect.Method 클래스를 생성하고, Method 클래스의 invoke 메소드로 호출하는 형태(Proxy),[object Object],Reflection 호출 자체가 실행속도에 안좋은 영향을 줌. 성능 저하,[object Object],예) Spring에서는  Proxy 개선 : CGLIB Proxy ,[object Object],Reflection 없이 속도 향상!,[object Object]
빠른 속도,[object Object],Reflection API를 쓰지 않아도 바로 invoke 해 줄 수있고, 속도도 빠른 새로운 API가 필요,[object Object],JVM 의 invoke 명령어 중 새로운 API를 추가하자!,[object Object]
잠깐.. JVM byte code 공부,[object Object]
JVM byte code,[object Object],JVM에서 동작하는 native language (assembly와 비슷),[object Object],JVM byte code,[object Object],Stack에 작업(push/pop/dup/swap)을 하고, 실행시키는 machanism,[object Object],Operand stack : byte code가 실행할 수 있는 임시용의 stack (cpu의 register stack),[object Object]
JVM byte code의 instruction,[object Object],ldc/const : stack에 값을 push ,[object Object],load/store : 로컬 변수 접근 관련,[object Object],aaload/*aload : array로부터 값을 얻기,[object Object],iinc : i++,[object Object],if_icmpge :conditional jump,[object Object],return,[object Object],Invoke ,[object Object],virtual : 인터페이스가 아닌 메소드를 호출. (대부분),[object Object],interface : 인터페이스 메소드를 호출,[object Object],static : static 호출,[object Object],special : 생성자와super class 메소드의 구현 메소드를 호출,[object Object]
Java ByteCode출력방법,[object Object],javap –c 클래스이름,[object Object]
예제,[object Object],String s = "Hello World";,[object Object],System.out.println(s);,[object Object],java,[object Object],ldc #2          // ‘Hello World’ stack에 저장(push)한다.,[object Object],astore_1      //Stack에서 ‘Hellow World’를 꺼내 로컬변수 1에 저장한다.,[object Object],getstatic#3 //System.out에서 static field인 PrintStream클래스를 꺼낸다.,[object Object],aload_1      // 로컬변수 1에서 가르키는Stirng을 읽는다.,[object Object],invokevirtual #4  // PrintStream의 println을 호출한다. ,[object Object],// java/io/PrintStream.println:(Ljava/lang/String;)V,[object Object],jvm,[object Object]
JVM invokevirtualinstuction이슈,[object Object],invokevirtual instruction은 메소드의파라미터의 클래스타입(descriptor)을 반드시 알아야 함,[object Object],invokevirtual <method-spec>,[object Object],classname, methodname,descriptor,[object Object],com/google/Myclass/myMethod(Ljava/lang/String;)V,[object Object],-----------------------                 ---------------------,[object Object],                -------------                  ,[object Object],descriptor,[object Object],classname,[object Object],methodname,[object Object]
JVM invokevirtualinstuction예제,[object Object],Object x; ,[object Object],... ,[object Object],x.equals("hello"); ,[object Object],java,[object Object],aload_1 ; 로컬 변수 ‘x’를 스택첫번째에 저장,[object Object],ldc"hello"   ; 스택에‘hello’라는 Sting값을 저장,[object Object],;  ‘equals’ 메소드 호출,[object Object],; 스택에 저장되는 값은 Boolgean값(Z),[object Object],invokevirtual   java/lang/Object/equals(Ljava/lang/Object;)Z,[object Object],jvm,[object Object]
invokestatic,[object Object]
invokestatic,[object Object],String s = System.getProperty("java.home");,[object Object],java,[object Object],ldc#2              //String ”java.home”을 stack에 저장,[object Object],invokestatic#3  //Method java/lang/System.getProperty:,[object Object],                         //  (Ljava/lang/String;)Ljava/lang/String;,[object Object],astore_1,[object Object],jvm,[object Object]
invokestatic,[object Object]
invokestatic,[object Object]
invokevirtual,[object Object]
invokevirtual,[object Object],PrintStream out = System.out;,[object Object],out.println("Hello World");,[object Object],java,[object Object],getstatic #16,[object Object],astore_1,[object Object],aload_1,[object Object],ldc#2,[object Object],invokevirtual #4    //Method java/io/PrintStream.println:,[object Object],                         //(Ljava/lang/String;)V,[object Object],jvm,[object Object]
invokevirtual,[object Object],출처 : http://cr.openjdk.java.net/~jrose/pres/200906-Cookbook.pdf,[object Object]
invokevirtual,[object Object]
invokevirtual,[object Object]
invokedynamic,[object Object]
invokedynamic,[object Object],function max(x, y) {,[object Object],    if (x.lessThan(y)) then y else x,[object Object],},[object Object],동적,[object Object],타입,[object Object],언어,[object Object],aload_1; aload_2,[object Object],invokedynamic#3 //  NameAndTypelessThan:,[object Object],                         // (Ljava/lang/Object;Ljava/lang/Object;)Z,[object Object],if_icmpeq,[object Object],jvm,[object Object],Boolean 리턴타입. Argument는 타입없는object,[object Object]
invokedynamic,[object Object],C언어의 함수 포인터와 비슷!,[object Object]
invokedynamic이후Bootstrap instruction 부트 로직,[object Object]
JVM 동작 순서,[object Object],invokedynamic명령어를 실행하기 전에 java.lang.invoke.CallSite를 확인,[object Object],CallSite가 없다면, 동적 타입 언어의 런타임에서 bootstrap 메소드를 호출,[object Object],Bootstrap 메소드는CallSite객체를 반환(invokedynamic은 CallSite에 링크됨),[object Object],invokedynamic은 CallSite에 저장된 java.net.MethodHandle(MH)를 이용해서 메소드 호출,[object Object],CallSite가 이미 등록된 invokedynamic이 다시 실행되면, 위 과정 없이 바로 메소드 호출(invokedynamic이 구현에 대한 MethodHandle을 한번이라도 사용하면, 그 MethodHandle을 사용),[object Object]
up call,[object Object],리눅스,[object Object],low level 이 high level에 있는 함수를 호출하는 것이죠. signal handler 같은 것,[object Object],JVM,[object Object],JVM의 invokedynamic이 bootstrap 메소드를 호출하는 것,[object Object]
코드 구현 예제 #1,[object Object],public class HelloWorld {,[object Object],    public static void main(String[] args) {,[object Object],//PSEUDOCODE FOR A JVM INSTRUCTION,[object Object],        //invokedynamic[#bootstrapDynamic]("Hello World", 2, 3.14);,[object Object],    },[object Object],    private static void printArgs(Object... args) {,[object Object],System.out.println(java.util.Arrays.deepToString(args));,[object Object],    },[object Object],    private static MethodHandleprintArgs;,[object Object],    static {,[object Object],MethodHandles.Lookuplookup = MethodHandles.lookup();,[object Object],         Class thisClass = lookup.lookupClass(); ,[object Object],try {,[object Object],printArgs= lookup.findStatic(thisClass, "printArgs", MethodType.methodType(void.class, ,[object Object],                                                         Object[].class));,[object Object],} catch (Exception e) {,[object Object],e.printStackTrace();,[object Object],},[object Object],    },[object Object],private staticCallSitebootstrapDynamic(MethodHandles.Lookup caller, String name, ,[object Object],MethodType type) {,[object Object],return new ConstantCallSite(printArgs.asType(type));,[object Object],    },[object Object],},[object Object]
코드 구현 예제 #2,[object Object],public class IntegerOps {,[object Object],public static Integer adder(Integer x, Integer y) {,[object Object],    return x + y;,[object Object],  },[object Object],},[object Object],public class Example {,[object Object],  public static CallSitemybsm(MethodHandles.LookupcallerClass, String dynMethodName, MethodTypedynMethodType)  throws Throwable {,[object Object],MethodHandlemh= callerClass.findStatic(Example.class, "IntegerOps.adder", ,[object Object],MethodType.methodType(Integer.class, Integer.class, Integer.class));,[object Object],    if (!dynMethodType.equals(mh.type())) {,[object Object],mh = mh.asType(dynMethodType);,[object Object],    },[object Object],    return new ConstantCallSite(mh);,[object Object],  },[object Object],},[object Object]
코드 구현 예제 #2,[object Object],InvokeVirtual과 달리 메소드 호출을 위한 클래스 정보가 필요 없다. 대신 길다.,[object Object],Jvmbytecode,[object Object],invokedynamicinvokedynamic,[object Object],REF_invokestatic:,[object Object],Example.mybsm:,[object Object],      "(Ljava/lang/invoke/MethodHandles/Lookup;,[object Object],Ljava/lang/String;,[object Object],Ljava/lang/invoke/MethodType;),[object Object],Ljava/lang/invoke/CallSite;":,[object Object],    +:,[object Object],      "(Ljava/lang/Integer;,[object Object],Ljava/lang/Integer;),[object Object],Ljava/lang/Integer;";,[object Object]
코드 구현 예제 #2,[object Object],invokedynamicinvokedynamic,[object Object],REF_invokestatic:,[object Object],Example.mybsm:,[object Object],      "(Ljava/lang/invoke/MethodHandles/Lookup;,[object Object],Ljava/lang/String;,[object Object],Ljava/lang/invoke/MethodType;),[object Object],Ljava/lang/invoke/CallSite;":,[object Object],    +:,[object Object],      "(Ljava/lang/Integer;,[object Object],Ljava/lang/Integer;),[object Object],Ljava/lang/Integer;";,[object Object],bootstrap 메소드가addr static 메소드를 호출,[object Object],1,[object Object],2,[object Object],Bootstrap의 Full Qualified name인 Example.mybsm,[object Object],3,[object Object],bootstrap 메소드가addr static 메소드를 호출,[object Object]
API,[object Object],java.lang.invoke..MethodHandle (MH) ,[object Object],JVM 메소드에 대한 anonymous reference 을 가지고 있음,[object Object],MethodHandles.Lookup,[object Object],factory for creating method handles,[object Object],java.lang.invoke.CallSite,[object Object],MethodHandler변수를 가지고 있는 Holder,[object Object],ConstantCallSite, MutableCallSite,[object Object],BootstrapMethodError,[object Object],invokedynamic호출후bootstrap 메소드을못찾거나Call site을 리턴하지 못하면 에러 발생,[object Object]
JSR 292,[object Object],JSR292,[object Object]
JSR 292 -Spec.zip,[object Object]
JSR 292,[object Object],JRuby팀과협업,[object Object],enhanced bytecode + a new API,[object Object],invokedynamic,[object Object],java.lang.invoke,[object Object],MethodHandle(일종의 함수 포인터),[object Object],Combinators,[object Object],provide adhoc classes: ClassValue(캐쉬), SwitchPoint (상태확인),[object Object]
JVM Spec Changed,[object Object]
참고,[object Object]
JRuby실전 테스트,[object Object],jruby에서 jvm버전을 변경하고 싶을 때는 JAVA_HOME을 변경하면 된다.  (따로 properties 설정은 없다.),[object Object],C:ruby-1.6.3-without-jvmin>jruby.exe -v,[object Object],jruby 1.6.3 (ruby-1.8.7-p330) (2011-07-07 965162f) (Java HotSpot(TM) Client VM 1.7.0) [Windows 7-x86-java],[object Object],C:ruby-1.6.3-without-jvmin>java -classpath.;jruby.jar  a.JRubyExample,[object Object],num: 6,[object Object],C:ruby-1.6.3-without-jvmin>,[object Object]
JRuby실전 테스트,[object Object],myruby.rb,[object Object],def max(a,b),[object Object],  if a < b,[object Object],    b,[object Object],  else,[object Object],    a,[object Object],  end,[object Object],end,[object Object],defgetMax(number1, number2),[object Object],    f = max(number1, number2),[object Object],    return f,[object Object],end,[object Object]
JRuby실전 테스트,[object Object],a.JRubyExample.java,[object Object],public static void main(String[] args) throws Exception {,[object Object],ScriptEnginejruby = new ScriptEngineManager().getEngineByName("jruby");,[object Object],jruby.eval(new BufferedReader(new FileReader("myruby.rb")));,[object Object],jruby.put("number1", 6);,[object Object],jruby.put("number2", 9);,[object Object],        long num = (Long) jruby.eval("getMax($number1, $number1)");,[object Object],System.out.println("num: " + num);,[object Object],},[object Object]
JRuby실전 테스트,[object Object],C:ruby-1.6.3-without-jvmin>jrubyc.bat myruby.rb,[object Object],  public static org.jruby.runtime.builtin.IRubyObject method__0$RUBY$max(myruby,,[object Object],org.jruby.runtime.ThreadContext, org.jruby.runtime.builtin.IRubyObject, org.jru,[object Object],by.runtime.builtin.IRubyObject, org.jruby.runtime.builtin.IRubyObject, org.jruby,[object Object],.runtime.Block);,[object Object],    Code:,[object Object],       0: aload_3,[object Object],       1: astore        10,[object Object],       3: aload         4,[object Object],       5: astore        11,[object Object],       7: aload_0,[object Object],       8: invokevirtual #33                 // Method getCallSite0:()Lorg/jruby/,[object Object],runtime/CallSite;,[object Object],      11: aload_1,[object Object],      12: aload_2,[object Object],      13: aload         10,[object Object],      15: aload         11,[object Object],      17: invokevirtual #39                 // Method org/jruby/runtime/CallSite,[object Object],.call:(Lorg/jruby/runtime/ThreadContext;Lorg/jruby/runtime/builtin/IRubyObject;L,[object Object],org/jruby/runtime/builtin/IRubyObject;Lorg/jruby/runtime/builtin/IRubyObject;)Lo,[object Object],rg/jruby/runtime/builtin/IRubyObject;,[object Object],      20: invokeinterface #45,  1           // InterfaceMethod org/jruby/runtime,[object Object],/builtin/IRubyObject.isTrue:()Z,[object Object],      25: ifeq          33,[object Object],      28: aload         11,[object Object],      30: goto          35,[object Object],      33: aload         10,[object Object],      35: areturn,[object Object],비슷한 구현이 이미 되어 있음,[object Object]
JRuby의 성능,[object Object],http://eyweb-images.s3.amazonaws.com/blog_crossimp.jpg,[object Object]
정리,[object Object],Jruby,[object Object],1.6.3까지는 invokedynamic사용하지 않음. (invokedynamic테스트 버전은 따로 있음.),[object Object],대신 내부적으로 invokedynamic비슷한 구현을 이미 하고 있음 ,[object Object],Groovy,[object Object],Jruby처럼 내부적으로는 invokedynamic비슷한 구현 함,[object Object],앞으로 많은 언어들이 쓸 수 있도록 배려했고, 비슷하게 구현한 것들은 조금 더 빠른 속도가 날 수 있으며, 더 많은 언어들이 이 기능을 사용할 수 있음,[object Object]
To be continued #6,[object Object],49,[object Object]

More Related Content

What's hot

java 8 람다식 소개와 의미 고찰
java 8 람다식 소개와 의미 고찰java 8 람다식 소개와 의미 고찰
java 8 람다식 소개와 의미 고찰Sungchul Park
 
파이썬 병렬프로그래밍
파이썬 병렬프로그래밍파이썬 병렬프로그래밍
파이썬 병렬프로그래밍Yong Joon Moon
 
Android ndk jni 설치및 연동
Android ndk jni 설치및 연동Android ndk jni 설치및 연동
Android ndk jni 설치및 연동Sangon Lee
 
자바에서 null을 안전하게 다루는 방법
자바에서 null을 안전하게 다루는 방법자바에서 null을 안전하게 다루는 방법
자바에서 null을 안전하게 다루는 방법Sungchul Park
 
골때리는 자바스크립트 발표자료
골때리는 자바스크립트 발표자료골때리는 자바스크립트 발표자료
골때리는 자바스크립트 발표자료욱진 양
 
일단 시작하는 코틀린
일단 시작하는 코틀린일단 시작하는 코틀린
일단 시작하는 코틀린Park JoongSoo
 
안드로이드 스터디 Jni 발표 자료 Rev05 송형주
안드로이드 스터디 Jni 발표 자료 Rev05 송형주안드로이드 스터디 Jni 발표 자료 Rev05 송형주
안드로이드 스터디 Jni 발표 자료 Rev05 송형주iamhjoo (송형주)
 
비전공자의 자바스크립트 도전기
비전공자의 자바스크립트 도전기비전공자의 자바스크립트 도전기
비전공자의 자바스크립트 도전기jeong seok yang
 
[1B4]안드로이드 동시성_프로그래밍
[1B4]안드로이드 동시성_프로그래밍[1B4]안드로이드 동시성_프로그래밍
[1B4]안드로이드 동시성_프로그래밍NAVER D2
 
자바8 람다식 소개
자바8 람다식 소개자바8 람다식 소개
자바8 람다식 소개beom kyun choi
 
0.javascript기본(~3일차내)
0.javascript기본(~3일차내)0.javascript기본(~3일차내)
0.javascript기본(~3일차내)Sung-hoon Ma
 
프론트엔드스터디 E03 - Javascript intro.
프론트엔드스터디 E03 - Javascript intro.프론트엔드스터디 E03 - Javascript intro.
프론트엔드스터디 E03 - Javascript intro.Young-Beom Rhee
 
ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!WooYoung Cho
 
GKAC 2015 Apr. - Android Looper
GKAC 2015 Apr. - Android LooperGKAC 2015 Apr. - Android Looper
GKAC 2015 Apr. - Android LooperGDG Korea
 
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출GDG Korea
 
Angular2 router&http
Angular2 router&httpAngular2 router&http
Angular2 router&httpDong Jun Kwon
 

What's hot (19)

java 8 람다식 소개와 의미 고찰
java 8 람다식 소개와 의미 고찰java 8 람다식 소개와 의미 고찰
java 8 람다식 소개와 의미 고찰
 
파이썬 병렬프로그래밍
파이썬 병렬프로그래밍파이썬 병렬프로그래밍
파이썬 병렬프로그래밍
 
Android ndk jni 설치및 연동
Android ndk jni 설치및 연동Android ndk jni 설치및 연동
Android ndk jni 설치및 연동
 
자바에서 null을 안전하게 다루는 방법
자바에서 null을 안전하게 다루는 방법자바에서 null을 안전하게 다루는 방법
자바에서 null을 안전하게 다루는 방법
 
골때리는 자바스크립트 발표자료
골때리는 자바스크립트 발표자료골때리는 자바스크립트 발표자료
골때리는 자바스크립트 발표자료
 
일단 시작하는 코틀린
일단 시작하는 코틀린일단 시작하는 코틀린
일단 시작하는 코틀린
 
안드로이드 스터디 Jni 발표 자료 Rev05 송형주
안드로이드 스터디 Jni 발표 자료 Rev05 송형주안드로이드 스터디 Jni 발표 자료 Rev05 송형주
안드로이드 스터디 Jni 발표 자료 Rev05 송형주
 
비전공자의 자바스크립트 도전기
비전공자의 자바스크립트 도전기비전공자의 자바스크립트 도전기
비전공자의 자바스크립트 도전기
 
Java 기초
Java 기초Java 기초
Java 기초
 
[1B4]안드로이드 동시성_프로그래밍
[1B4]안드로이드 동시성_프로그래밍[1B4]안드로이드 동시성_프로그래밍
[1B4]안드로이드 동시성_프로그래밍
 
4-1. javascript
4-1. javascript4-1. javascript
4-1. javascript
 
Java lambda
Java lambdaJava lambda
Java lambda
 
자바8 람다식 소개
자바8 람다식 소개자바8 람다식 소개
자바8 람다식 소개
 
0.javascript기본(~3일차내)
0.javascript기본(~3일차내)0.javascript기본(~3일차내)
0.javascript기본(~3일차내)
 
프론트엔드스터디 E03 - Javascript intro.
프론트엔드스터디 E03 - Javascript intro.프론트엔드스터디 E03 - Javascript intro.
프론트엔드스터디 E03 - Javascript intro.
 
ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!
 
GKAC 2015 Apr. - Android Looper
GKAC 2015 Apr. - Android LooperGKAC 2015 Apr. - Android Looper
GKAC 2015 Apr. - Android Looper
 
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
 
Angular2 router&http
Angular2 router&httpAngular2 router&http
Angular2 router&http
 

Similar to Jdk(java) 7 - 5. invoke-dynamic

Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기jongho jeong
 
Domain Specific Languages With Groovy
Domain Specific Languages With GroovyDomain Specific Languages With Groovy
Domain Specific Languages With GroovyTommy C. Kang
 
Startup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSStartup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSCirculus
 
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기NAVER Engineering
 
Java 8 & Beyond
Java 8 & BeyondJava 8 & Beyond
Java 8 & BeyondJay Lee
 
Javascript 교육자료 pdf
Javascript 교육자료 pdfJavascript 교육자료 pdf
Javascript 교육자료 pdfHyosang Hong
 
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs기동 이
 
Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)Choonghyun Yang
 
안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계Leonardo YongUk Kim
 
반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게Sungju Jin
 
Java mentoring of samsung scsc 2
Java mentoring of samsung scsc   2Java mentoring of samsung scsc   2
Java mentoring of samsung scsc 2도현 김
 
Pinpoint spring_camp 2015
Pinpoint spring_camp 2015Pinpoint spring_camp 2015
Pinpoint spring_camp 2015Woonduk-Kang
 
(IT실무교육/국비지원교육/자바/스프링교육추천)#15.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
(IT실무교육/국비지원교육/자바/스프링교육추천)#15.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)(IT실무교육/국비지원교육/자바/스프링교육추천)#15.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
(IT실무교육/국비지원교육/자바/스프링교육추천)#15.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)탑크리에듀(구로디지털단지역3번출구 2분거리)
 
자바와 사용하기2
자바와 사용하기2자바와 사용하기2
자바와 사용하기2destinycs
 

Similar to Jdk(java) 7 - 5. invoke-dynamic (20)

Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기
 
Domain Specific Languages With Groovy
Domain Specific Languages With GroovyDomain Specific Languages With Groovy
Domain Specific Languages With Groovy
 
Startup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSStartup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JS
 
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
 
Java(2/4)
Java(2/4)Java(2/4)
Java(2/4)
 
Node.js at OKJSP
Node.js at OKJSPNode.js at OKJSP
Node.js at OKJSP
 
Java 8 & Beyond
Java 8 & BeyondJava 8 & Beyond
Java 8 & Beyond
 
Javascript 교육자료 pdf
Javascript 교육자료 pdfJavascript 교육자료 pdf
Javascript 교육자료 pdf
 
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs
 
Java_01 기초
Java_01 기초Java_01 기초
Java_01 기초
 
Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)
 
Java(1/4)
Java(1/4)Java(1/4)
Java(1/4)
 
안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계
 
반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게
 
Java mentoring of samsung scsc 2
Java mentoring of samsung scsc   2Java mentoring of samsung scsc   2
Java mentoring of samsung scsc 2
 
Node.js intro
Node.js introNode.js intro
Node.js intro
 
Pinpoint spring_camp 2015
Pinpoint spring_camp 2015Pinpoint spring_camp 2015
Pinpoint spring_camp 2015
 
4-3. jquery
4-3. jquery4-3. jquery
4-3. jquery
 
(IT실무교육/국비지원교육/자바/스프링교육추천)#15.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
(IT실무교육/국비지원교육/자바/스프링교육추천)#15.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)(IT실무교육/국비지원교육/자바/스프링교육추천)#15.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
(IT실무교육/국비지원교육/자바/스프링교육추천)#15.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
 
자바와 사용하기2
자바와 사용하기2자바와 사용하기2
자바와 사용하기2
 

More from knight1128

Hancom MDS Conference - KAKAO DEVOPS Practice (카카오 스토리의 Devops 사례)
Hancom MDS Conference - KAKAO DEVOPS Practice (카카오 스토리의 Devops 사례)Hancom MDS Conference - KAKAO DEVOPS Practice (카카오 스토리의 Devops 사례)
Hancom MDS Conference - KAKAO DEVOPS Practice (카카오 스토리의 Devops 사례)knight1128
 
Spring MVC 3 Restful
Spring MVC 3 RestfulSpring MVC 3 Restful
Spring MVC 3 Restfulknight1128
 
Jersey framework
Jersey frameworkJersey framework
Jersey frameworkknight1128
 
Google Protocol buffer
Google Protocol bufferGoogle Protocol buffer
Google Protocol bufferknight1128
 
Jdk(java) 7 - 6 기타기능
Jdk(java) 7 - 6 기타기능Jdk(java) 7 - 6 기타기능
Jdk(java) 7 - 6 기타기능knight1128
 
Jdk 7 4-forkjoin
Jdk 7 4-forkjoinJdk 7 4-forkjoin
Jdk 7 4-forkjoinknight1128
 
공유 Jdk 7-2-project coin
공유 Jdk 7-2-project coin공유 Jdk 7-2-project coin
공유 Jdk 7-2-project coinknight1128
 
공유 Jdk 7-1-short introduction
공유 Jdk 7-1-short introduction공유 Jdk 7-1-short introduction
공유 Jdk 7-1-short introductionknight1128
 
아마존 Aws 서비스_연구
아마존 Aws 서비스_연구아마존 Aws 서비스_연구
아마존 Aws 서비스_연구knight1128
 
구글크롬Os
구글크롬Os구글크롬Os
구글크롬Osknight1128
 
하이브리드앱
하이브리드앱하이브리드앱
하이브리드앱knight1128
 
오픈소스를 활용한 Batch_처리_플랫폼_공유
오픈소스를 활용한 Batch_처리_플랫폼_공유오픈소스를 활용한 Batch_처리_플랫폼_공유
오픈소스를 활용한 Batch_처리_플랫폼_공유knight1128
 
Ssl 하드웨어 가속기를 이용한 성능 향상
Ssl 하드웨어 가속기를 이용한 성능 향상Ssl 하드웨어 가속기를 이용한 성능 향상
Ssl 하드웨어 가속기를 이용한 성능 향상knight1128
 

More from knight1128 (19)

Hancom MDS Conference - KAKAO DEVOPS Practice (카카오 스토리의 Devops 사례)
Hancom MDS Conference - KAKAO DEVOPS Practice (카카오 스토리의 Devops 사례)Hancom MDS Conference - KAKAO DEVOPS Practice (카카오 스토리의 Devops 사례)
Hancom MDS Conference - KAKAO DEVOPS Practice (카카오 스토리의 Devops 사례)
 
Comet
CometComet
Comet
 
Apache avro
Apache avroApache avro
Apache avro
 
Apache Thrift
Apache ThriftApache Thrift
Apache Thrift
 
Redis
RedisRedis
Redis
 
Spring MVC 3 Restful
Spring MVC 3 RestfulSpring MVC 3 Restful
Spring MVC 3 Restful
 
Jersey framework
Jersey frameworkJersey framework
Jersey framework
 
Google Protocol buffer
Google Protocol bufferGoogle Protocol buffer
Google Protocol buffer
 
Jdk(java) 7 - 6 기타기능
Jdk(java) 7 - 6 기타기능Jdk(java) 7 - 6 기타기능
Jdk(java) 7 - 6 기타기능
 
Jdk 7 4-forkjoin
Jdk 7 4-forkjoinJdk 7 4-forkjoin
Jdk 7 4-forkjoin
 
Jdk 7 3-nio2
Jdk 7 3-nio2Jdk 7 3-nio2
Jdk 7 3-nio2
 
공유 Jdk 7-2-project coin
공유 Jdk 7-2-project coin공유 Jdk 7-2-project coin
공유 Jdk 7-2-project coin
 
공유 Jdk 7-1-short introduction
공유 Jdk 7-1-short introduction공유 Jdk 7-1-short introduction
공유 Jdk 7-1-short introduction
 
아마존 Aws 서비스_연구
아마존 Aws 서비스_연구아마존 Aws 서비스_연구
아마존 Aws 서비스_연구
 
속도체크
속도체크속도체크
속도체크
 
구글크롬Os
구글크롬Os구글크롬Os
구글크롬Os
 
하이브리드앱
하이브리드앱하이브리드앱
하이브리드앱
 
오픈소스를 활용한 Batch_처리_플랫폼_공유
오픈소스를 활용한 Batch_처리_플랫폼_공유오픈소스를 활용한 Batch_처리_플랫폼_공유
오픈소스를 활용한 Batch_처리_플랫폼_공유
 
Ssl 하드웨어 가속기를 이용한 성능 향상
Ssl 하드웨어 가속기를 이용한 성능 향상Ssl 하드웨어 가속기를 이용한 성능 향상
Ssl 하드웨어 가속기를 이용한 성능 향상
 

Jdk(java) 7 - 5. invoke-dynamic

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.