Skip to content

Commit 15777d1

Browse files
authored
Merge pull request #1 from Midnight145/Midnight145-patch-1
R::set can now modify final fields on old java versions
2 parents 8f990a0 + b036d97 commit 15777d1

File tree

1 file changed

+15
-2
lines changed
  • src/main/java/me/mrnavastar/r

1 file changed

+15
-2
lines changed

src/main/java/me/mrnavastar/r/R.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,14 @@
66

77
public class R {
88

9+
private static boolean oldJavaCompat = false;
10+
static {
11+
try {
12+
Field.class.getDeclaredField("modifiers");
13+
oldJavaCompat = true;
14+
} catch (NoSuchFieldException ignore) {}
15+
}
16+
917
private final Object instance;
1018
private final Class<?> clazz;
1119

@@ -88,7 +96,12 @@ public <T> T get(String name, Class<T> type) {
8896
*/
8997
public R set(String name, Object value) {
9098
try {
91-
findField(name, clazz).set(instance, value);
99+
Field toSet = findField(name, clazz);
100+
if (oldJavaCompat) {
101+
Field modifiersField = findField("modifiers", toSet.getClass());
102+
modifiersField.setInt(toSet, toSet.getModifiers() & ~java.lang.reflect.Modifier.FINAL);
103+
}
104+
toSet.set(instance, value);
92105
} catch (NoSuchFieldException | IllegalAccessException e) {
93106
throw new RuntimeException(e);
94107
}
@@ -137,4 +150,4 @@ public Class<?>[] generics() {
137150
}
138151
return new Class[]{};
139152
}
140-
}
153+
}

0 commit comments

Comments
 (0)