Skip to content

Instantly share code, notes, and snippets.

@hdeshev
Created October 11, 2011 08:00
Show Gist options
  • Save hdeshev/1277525 to your computer and use it in GitHub Desktop.
Save hdeshev/1277525 to your computer and use it in GitHub Desktop.
Scala structural types implemented with reflection
scala> :javap Greeter -c
Compiled from "<console>"
public class Greeter extends java.lang.Object implements scala.ScalaObject{
public static {};
Code:
0: iconst_0
1: anewarray #8; //class java/lang/Class
4: putstatic #14; //Field reflParams$Cache1:[Ljava/lang/Class;
7: new #16; //class java/lang/ref/SoftReference
10: dup
11: new #18; //class scala/runtime/EmptyMethodCache
14: dup
15: invokespecial #21; //Method scala/runtime/EmptyMethodCache."<init>":()V
18: invokespecial #24; //Method java/lang/ref/SoftReference."<init>":(Ljava/lang/Object;)V
21: putstatic #28; //Field reflPoly$Cache1:Ljava/lang/ref/SoftReference;
24: return
public static java.lang.reflect.Method reflMethod$Method1(java.lang.Class);
Code:
0: getstatic #28; //Field reflPoly$Cache1:Ljava/lang/ref/SoftReference;
3: invokevirtual #34; //Method java/lang/ref/SoftReference.get:()Ljava/lang/Object;
6: checkcast #36; //class scala/runtime/MethodCache
9: ifnonnull 29
12: new #16; //class java/lang/ref/SoftReference
15: dup
16: new #18; //class scala/runtime/EmptyMethodCache
19: dup
20: invokespecial #21; //Method scala/runtime/EmptyMethodCache."<init>":()V
23: invokespecial #24; //Method java/lang/ref/SoftReference."<init>":(Ljava/lang/Object;)V
26: putstatic #28; //Field reflPoly$Cache1:Ljava/lang/ref/SoftReference;
29: getstatic #28; //Field reflPoly$Cache1:Ljava/lang/ref/SoftReference;
32: invokevirtual #34; //Method java/lang/ref/SoftReference.get:()Ljava/lang/Object;
35: checkcast #36; //class scala/runtime/MethodCache
38: aload_0
39: invokevirtual #39; //Method scala/runtime/MethodCache.find:(Ljava/lang/Class;)Ljava/lang/reflect/Method;
42: astore_1
43: aload_1
44: ifnonnull 89
47: getstatic #45; //Field scala/runtime/ScalaRunTime$.MODULE$:Lscala/runtime/ScalaRunTime$;
50: aload_0
51: ldc #47; //String name
53: getstatic #14; //Field reflParams$Cache1:[Ljava/lang/Class;
56: invokevirtual #51; //Method java/lang/Class.getMethod:(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
59: invokevirtual #55; //Method scala/runtime/ScalaRunTime$.ensureAccessible:(Ljava/lang/reflect/Method;)Ljava/lang/reflect/Method;
62: astore_1
63: new #16; //class java/lang/ref/SoftReference
66: dup
67: getstatic #28; //Field reflPoly$Cache1:Ljava/lang/ref/SoftReference;
70: invokevirtual #34; //Method java/lang/ref/SoftReference.get:()Ljava/lang/Object;
73: checkcast #36; //class scala/runtime/MethodCache
76: aload_0
77: aload_1
78: invokevirtual #59; //Method scala/runtime/MethodCache.add:(Ljava/lang/Class;Ljava/lang/reflect/Method;)Lscala/runtime/MethodCache;
81: invokespecial #24; //Method java/lang/ref/SoftReference."<init>":(Ljava/lang/Object;)V
84: putstatic #28; //Field reflPoly$Cache1:Ljava/lang/ref/SoftReference;
87: aload_1
88: areturn
89: aload_1
90: areturn
public java.lang.String greet(java.lang.Object);
Code:
0: getstatic #69; //Field scala/Predef$.MODULE$:Lscala/Predef$;
3: ldc #71; //String Hello, %s
5: invokevirtual #75; //Method scala/Predef$.augmentString:(Ljava/lang/String;)Lscala/collection/immutable/StringOps;
8: getstatic #69; //Field scala/Predef$.MODULE$:Lscala/Predef$;
11: iconst_1
12: anewarray #77; //class java/lang/Object
15: dup
16: iconst_0
17: aload_1
18: astore_2
19: aconst_null
20: astore_3
21: aload_2
22: invokevirtual #81; //Method java/lang/Object.getClass:()Ljava/lang/Class;
25: invokestatic #83; //Method reflMethod$Method1:(Ljava/lang/Class;)Ljava/lang/reflect/Method;
28: aload_2
29: iconst_0
30: anewarray #77; //class java/lang/Object
33: invokevirtual #89; //Method java/lang/reflect/Method.invoke:(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;
36: astore_3
37: aload_3
38: checkcast #91; //class java/lang/String
41: aastore
42: invokevirtual #95; //Method scala/Predef$.genericWrapArray:(Ljava/lang/Object;)Lscala/collection/mutable/WrappedArray;
45: invokeinterface #101, 2; //InterfaceMethod scala/collection/immutable/StringLike.format:(Lscala/collection/Seq;)Ljava/lang/String;
50: areturn
51: astore 4
53: aload 4
55: invokevirtual #107; //Method java/lang/reflect/InvocationTargetException.getCause:()Ljava/lang/Throwable;
58: athrow
Exception table:
from to target type
21 37 51 Class java/lang/reflect/InvocationTargetException
public Greeter();
Code:
0: aload_0
1: invokespecial #114; //Method java/lang/Object."<init>":()V
4: return
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment