|
28 | 28 | /** Scala types utils using reflection without dependency on scala library. */
|
29 | 29 | @SuppressWarnings({"unchecked", "rawtypes"})
|
30 | 30 | public class ScalaTypes {
|
31 |
| - private static final Class<?> SCALA_MAP_TYPE; |
32 |
| - private static final Class<?> SCALA_SEQ_TYPE; |
33 |
| - private static final Class<?> SCALA_ITERABLE_TYPE; |
34 |
| - private static final Class<?> SCALA_ITERATOR_TYPE; |
35 |
| - private static final java.lang.reflect.Type SCALA_ITERATOR_RETURN_TYPE; |
36 |
| - private static final java.lang.reflect.Type SCALA_NEXT_RETURN_TYPE; |
| 31 | + private static volatile Class<?> SCALA_MAP_TYPE; |
| 32 | + private static volatile Class<?> SCALA_SEQ_TYPE; |
| 33 | + private static volatile Class<?> SCALA_ITERABLE_TYPE; |
| 34 | + private static volatile java.lang.reflect.Type SCALA_ITERATOR_RETURN_TYPE; |
| 35 | + private static volatile java.lang.reflect.Type SCALA_NEXT_RETURN_TYPE; |
37 | 36 |
|
38 |
| - static { |
39 |
| - try { |
40 |
| - SCALA_ITERABLE_TYPE = ReflectionUtils.loadClass("scala.collection.Iterable"); |
41 |
| - SCALA_ITERATOR_TYPE = ReflectionUtils.loadClass("scala.collection.Iterator"); |
| 37 | + public static Class<?> getScalaMapType() { |
| 38 | + if (SCALA_MAP_TYPE == null) { |
| 39 | + // load scala classes dynamically to make graalvm native build work |
| 40 | + // see https://github.com/quarkiverse/quarkus-fury/issues/7 |
42 | 41 | SCALA_MAP_TYPE = ReflectionUtils.loadClass("scala.collection.Map");
|
43 |
| - SCALA_SEQ_TYPE = ReflectionUtils.loadClass("scala.collection.Seq"); |
44 |
| - SCALA_ITERATOR_RETURN_TYPE = SCALA_ITERABLE_TYPE.getMethod("iterator").getGenericReturnType(); |
45 |
| - SCALA_NEXT_RETURN_TYPE = SCALA_ITERATOR_TYPE.getMethod("next").getGenericReturnType(); |
46 |
| - } catch (NoSuchMethodException e) { |
47 |
| - throw new RuntimeException(e); |
48 | 42 | }
|
49 |
| - } |
50 |
| - |
51 |
| - public static Class<?> getScalaMapType() { |
52 | 43 | return SCALA_MAP_TYPE;
|
53 | 44 | }
|
54 | 45 |
|
55 | 46 | public static Class<?> getScalaSeqType() {
|
| 47 | + if (SCALA_SEQ_TYPE == null) { |
| 48 | + SCALA_SEQ_TYPE = ReflectionUtils.loadClass("scala.collection.Seq"); |
| 49 | + } |
56 | 50 | return SCALA_SEQ_TYPE;
|
57 | 51 | }
|
58 | 52 |
|
59 | 53 | public static Class<?> getScalaIterableType() {
|
| 54 | + if (SCALA_ITERABLE_TYPE == null) { |
| 55 | + SCALA_ITERABLE_TYPE = ReflectionUtils.loadClass("scala.collection.Iterable"); |
| 56 | + } |
60 | 57 | return SCALA_ITERABLE_TYPE;
|
61 | 58 | }
|
62 | 59 |
|
63 | 60 | public static TypeRef<?> getElementType(TypeRef typeRef) {
|
64 | 61 | TypeRef<?> supertype = typeRef.getSupertype(getScalaIterableType());
|
65 |
| - return supertype.resolveType(SCALA_ITERATOR_RETURN_TYPE).resolveType(SCALA_NEXT_RETURN_TYPE); |
| 62 | + return supertype |
| 63 | + .resolveType(getScalaIteratorReturnType()) |
| 64 | + .resolveType(getScalaNextReturnType()); |
| 65 | + } |
| 66 | + |
| 67 | + private static Type getScalaIteratorReturnType() { |
| 68 | + if (SCALA_ITERATOR_RETURN_TYPE == null) { |
| 69 | + try { |
| 70 | + SCALA_ITERATOR_RETURN_TYPE = |
| 71 | + getScalaIterableType().getMethod("iterator").getGenericReturnType(); |
| 72 | + } catch (NoSuchMethodException e) { |
| 73 | + throw new RuntimeException(e); |
| 74 | + } |
| 75 | + } |
| 76 | + return SCALA_ITERATOR_RETURN_TYPE; |
| 77 | + } |
| 78 | + |
| 79 | + private static Type getScalaNextReturnType() { |
| 80 | + if (SCALA_NEXT_RETURN_TYPE == null) { |
| 81 | + Class<?> scalaIteratorType = ReflectionUtils.loadClass("scala.collection.Iterator"); |
| 82 | + try { |
| 83 | + SCALA_NEXT_RETURN_TYPE = scalaIteratorType.getMethod("next").getGenericReturnType(); |
| 84 | + } catch (NoSuchMethodException e) { |
| 85 | + throw new RuntimeException(e); |
| 86 | + } |
| 87 | + } |
| 88 | + return SCALA_NEXT_RETURN_TYPE; |
66 | 89 | }
|
67 | 90 |
|
68 | 91 | /** Returns key/value type of scala map. */
|
|
0 commit comments