|
27 | 27 | import io.reactivex.Observer;
|
28 | 28 | import io.reactivex.internal.fuseable.QueueDisposable;
|
29 | 29 | import io.reactivex.internal.observers.BasicFuseableObserver;
|
30 |
| -import java.lang.invoke.MethodHandle; |
31 |
| -import java.lang.invoke.MethodHandles; |
| 30 | +import java.lang.reflect.Field; |
32 | 31 |
|
33 | 32 | class TracingObserver<T> extends BasicFuseableObserver<T, T> {
|
34 |
| - private static final MethodHandle queueDisposableGetter = getQueueDisposableGetter(); |
| 33 | + private static final Field queueDisposableField = getQueueDisposableField(); |
35 | 34 |
|
36 | 35 | // BasicFuseableObserver#actual has been renamed to downstream in newer versions, we can't use it
|
37 | 36 | // in this class
|
@@ -81,34 +80,35 @@ public T poll() throws Exception {
|
81 | 80 | return getQueueDisposable().poll();
|
82 | 81 | }
|
83 | 82 |
|
| 83 | + @SuppressWarnings("unchecked") |
84 | 84 | private QueueDisposable<T> getQueueDisposable() {
|
85 | 85 | try {
|
86 |
| - return (QueueDisposable<T>) queueDisposableGetter.invoke(this); |
| 86 | + return (QueueDisposable<T>) queueDisposableField.get(this); |
87 | 87 | } catch (Throwable throwable) {
|
88 | 88 | throw new IllegalStateException(throwable);
|
89 | 89 | }
|
90 | 90 | }
|
91 | 91 |
|
92 |
| - private static MethodHandle getGetterHandle(String fieldName) { |
| 92 | + private static Field getField(String fieldName) { |
| 93 | + |
93 | 94 | try {
|
94 |
| - return MethodHandles.lookup() |
95 |
| - .findGetter(BasicFuseableObserver.class, fieldName, QueueDisposable.class); |
96 |
| - } catch (NoSuchFieldException | IllegalAccessException ignored) { |
| 95 | + return BasicFuseableObserver.class.getDeclaredField(fieldName); |
| 96 | + } catch (NoSuchFieldException ignored) { |
97 | 97 | // Ignore
|
98 | 98 | }
|
99 | 99 | return null;
|
100 | 100 | }
|
101 | 101 |
|
102 |
| - private static MethodHandle getQueueDisposableGetter() { |
103 |
| - MethodHandle getter = getGetterHandle("qd"); |
104 |
| - if (getter == null) { |
| 102 | + private static Field getQueueDisposableField() { |
| 103 | + Field queueDisposableField = getField("qd"); |
| 104 | + if (queueDisposableField == null) { |
105 | 105 | // in versions before 2.2.1 field was named "qs"
|
106 |
| - getter = getGetterHandle("qs"); |
| 106 | + queueDisposableField = getField("qs"); |
107 | 107 | }
|
108 |
| - return getter; |
| 108 | + return queueDisposableField; |
109 | 109 | }
|
110 | 110 |
|
111 | 111 | public static boolean canEnable() {
|
112 |
| - return queueDisposableGetter != null; |
| 112 | + return queueDisposableField != null; |
113 | 113 | }
|
114 | 114 | }
|
0 commit comments