ラムダ式(2) [Java 8]
ラムダ式に実際に渡されているオブジェクトが何であるかを調べるためのテストコードです。
このプログラムをコンパイルして実行すると、次の結果になります。
また、コンパイル結果の
ラムダ式を受け付けるメソッドとしてimport java.util.Arrays; import java.util.function.Consumer; public class Lambda02 { public static void main(String[] args) { showInfoOfLambda(msg -> System.out.println(msg)); } private static void showInfoOfLambda(Consumer<String> consumer) { consumer.accept("Hello World"); Class<?> consumerClass = consumer.getClass(); System.out.printf("class name : %s%n", consumerClass.getName()); showImplementedInterfaces(consumerClass); showSuperclass(consumerClass); } private static void showImplementedInterfaces(Class<?> consumerClass) { Class<?>[] interfaces = consumerClass.getInterfaces(); if (interfaces.length == 0) { System.out.println("no interface is implemented"); return; } System.out.print("implements : "); Arrays.asList(interfaces).forEach( cl -> System.out.printf("%s ", cl)); System.out.println(); } private static void showSuperclass(Class<?> consumerClass) { System.out.printf("superclass : %s%n", consumerClass.getSuperclass()); } }
showInfoOfLambda
メソッドを定義して、main
メソッドで引数を表示するだけのラムダ式を渡しています。showInfoOfLambda
では、最初に、Consumer
インタフェースとして渡された引数に対して、accept
メソッドを呼び出しています。次に渡されたオブジェクトのクラス、実装しているインタフェース、スーパークラスと順に表示しています。このプログラムをコンパイルして実行すると、次の結果になります。
実際に渡されているオブジェクトのクラスは、shibata-yoshiki-no-macbook:java8study yoshiki$ javac Lambda02.java shibata-yoshiki-no-macbook:java8study yoshiki$ java Lambda02 Hello World class name : Lambda02$$Lambda$1 implements : interface java.util.function.Consumer superclass : class java.lang.invoke.MagicLambdaImpl shibata-yoshiki-no-macbook:java8study yoshiki$ ls -l *.class -rw-r--r-- 1 yoshiki staff 2313 3 17 11:07 Lambda02.class shibata-yoshiki-no-macbook:java8study yoshiki$
Lambda02$$Lambda$1
、実装しているインタフェースはjava.util.function.Consumer
、スーパークラスは java.lang.invoke.MagicLambdaImpl
と表示されています。また、コンパイル結果の
.class
ファイルは、Lambda02.class
しかありません。したがって、Lambda02$$Lambda$1
は、実行時に動的に生成されていることが推測されます。
2013-03-17 10:58
nice!(0)
コメント(2)
トラックバック(0)
ご存知かもしれませんが、Lambdaの動的クラス生成に関しては、JavaOneのBrian Goetzの発表資料が参考になると思います。
Lambda: A Peek Under the Hood
http://www.myexpospace.com/JavaOne2012/SessionFiles/CON6080_PDF_6080_0001.pdf
by さくらば (2013-03-18 14:57)
さくらばさん、
情報ありがとうございます!
by Yoshiki (2013-03-18 18:43)