Skip to content

Commit 015f425

Browse files
Bug fix for JDK 25. Releasing new version
1 parent d91d5cc commit 015f425

File tree

2 files changed

+73
-16
lines changed

2 files changed

+73
-16
lines changed

java/src/main/java/io/github/toolfactory/jvm/function/catalog/GetFieldValueFunction.java

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -51,16 +51,17 @@ public ForJava7(Map<Object, Object> context) {
5151

5252
@Override
5353
public Object apply(Object target, Field field) {
54-
target = Modifier.isStatic(field.getModifiers())?
54+
boolean isStatic = Modifier.isStatic(field.getModifiers());
55+
target = isStatic?
5556
field.getDeclaringClass() :
5657
target;
57-
long fieldOffset = Modifier.isStatic(field.getModifiers())?
58+
Long fieldOffset = isStatic?
5859
unsafe.staticFieldOffset(field) :
5960
unsafe.objectFieldOffset(field);
60-
return retrieveFromUnsafe(target, field, fieldOffset, field.getType());
61+
return getByUnsafe(target, field, fieldOffset, field.getType());
6162
}
6263

63-
protected Object retrieveFromUnsafe(Object target, Field field, long fieldOffset, Class<?> cls) {
64+
protected Object getByUnsafe(Object target, Field field, long fieldOffset, Class<?> cls) {
6465
if(!cls.isPrimitive()) {
6566
if (!Modifier.isVolatile(field.getModifiers())) {
6667
return unsafe.getObject(target, fieldOffset);
@@ -119,10 +120,11 @@ protected Object retrieveFromUnsafe(Object target, Field field, long fieldOffset
119120
}
120121
}
121122

122-
public static class ForJava14 extends ForJava7 {
123-
SetAccessibleFunction setAccessibleFunction;
124-
ThrowExceptionFunction throwExceptionFunction;
125-
public ForJava14(Map<Object, Object> context) {
123+
public static class ForJava25 extends ForJava7 {
124+
protected SetAccessibleFunction setAccessibleFunction;
125+
protected ThrowExceptionFunction throwExceptionFunction;
126+
127+
public ForJava25(Map<Object, Object> context) {
126128
super(context);
127129
setAccessibleFunction = ObjectProvider.get(context).getOrBuildObject(SetAccessibleFunction.class, context);
128130
throwExceptionFunction = ObjectProvider.get(context).getOrBuildObject(ThrowExceptionFunction.class, context);
@@ -131,14 +133,14 @@ public ForJava14(Map<Object, Object> context) {
131133
@Override
132134
public Object apply(Object target, Field field) {
133135
boolean isStatic = Modifier.isStatic(field.getModifiers());
134-
target = isStatic?
135-
field.getDeclaringClass() :
136-
target;
137-
Long fieldOffset = null;
138136
try {
139-
fieldOffset = isStatic?
137+
target = isStatic?
138+
field.getDeclaringClass() :
139+
target;
140+
Long fieldOffset = isStatic?
140141
unsafe.staticFieldOffset(field) :
141142
unsafe.objectFieldOffset(field);
143+
return getByUnsafe(target, field, fieldOffset, field.getType());
142144
} catch (UnsupportedOperationException exc) {
143145
try {
144146
setAccessibleFunction.accept(field, true);
@@ -152,7 +154,6 @@ public Object apply(Object target, Field field) {
152154
}
153155

154156
}
155-
return retrieveFromUnsafe(target, field, fieldOffset, field.getType());
156157
}
157158

158159
}

java/src/main/java/io/github/toolfactory/jvm/function/catalog/SetFieldValueFunction.java

Lines changed: 58 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,10 @@ public void accept(Object origTarget, Field field, Object value) {
6464
throw new IllegalArgumentException(Strings.compile("Value {} is not assignable to {}", value , field.getName()));
6565
}
6666
Class<?> fieldDeclaringClass = field.getDeclaringClass();
67+
boolean isStatic = Modifier.isStatic(field.getModifiers());
6768
long fieldOffset;
6869
Object target;
69-
if (Modifier.isStatic(field.getModifiers())) {
70+
if (isStatic) {
7071
fieldOffset = unsafe.staticFieldOffset(field);
7172
target = fieldDeclaringClass;
7273
} else {
@@ -80,7 +81,10 @@ public void accept(Object origTarget, Field field, Object value) {
8081
fieldOffset = unsafe.objectFieldOffset(field);
8182

8283
}
83-
Class<?> cls = field.getType();
84+
setByUnsafe(field, value, fieldOffset, target, field.getType());
85+
}
86+
87+
protected void setByUnsafe(Field field, Object value, long fieldOffset, Object target, Class<?> cls) {
8488
if(!cls.isPrimitive()) {
8589
if (!Modifier.isVolatile(field.getModifiers())) {
8690
unsafe.putObject(target, fieldOffset, value);
@@ -140,6 +144,58 @@ public void accept(Object origTarget, Field field, Object value) {
140144

141145
}
142146

147+
public static class ForJava25 extends ForJava7 {
148+
protected SetAccessibleFunction setAccessibleFunction;
149+
protected ThrowExceptionFunction throwExceptionFunction;
150+
151+
public ForJava25(Map<Object, Object> context) {
152+
super(context);
153+
setAccessibleFunction = ObjectProvider.get(context).getOrBuildObject(SetAccessibleFunction.class, context);
154+
throwExceptionFunction = ObjectProvider.get(context).getOrBuildObject(ThrowExceptionFunction.class, context);
155+
}
156+
157+
@Override
158+
public void accept(Object origTarget, Field field, Object value) {
159+
if(value != null && !Classes.isAssignableFrom(field.getType(), value.getClass())) {
160+
throw new IllegalArgumentException(Strings.compile("Value {} is not assignable to {}", value , field.getName()));
161+
}
162+
Class<?> fieldDeclaringClass = field.getDeclaringClass();
163+
boolean isStatic = Modifier.isStatic(field.getModifiers());
164+
Object target;
165+
if (isStatic) {
166+
target = fieldDeclaringClass;
167+
} else {
168+
if ((target = origTarget) == null) {
169+
throw new IllegalArgumentException("Target object is null");
170+
}
171+
Class<?> targetObjectClass = target.getClass();
172+
if (!Classes.isAssignableFrom(fieldDeclaringClass, targetObjectClass)) {
173+
throw new IllegalArgumentException("Target object class " + targetObjectClass + " is not assignable to " + fieldDeclaringClass);
174+
}
175+
}
176+
try {
177+
Long fieldOffset;
178+
if (isStatic) {
179+
fieldOffset = unsafe.staticFieldOffset(field);
180+
} else {
181+
fieldOffset = unsafe.objectFieldOffset(field);
182+
}
183+
setByUnsafe(field, value, fieldOffset, target, field.getType());
184+
} catch (UnsupportedOperationException exc) {
185+
try {
186+
setAccessibleFunction.accept(field, true);
187+
if (isStatic) {
188+
field.set(null, value);
189+
} else {
190+
field.set(target, value);
191+
}
192+
} catch (Throwable exc2) {
193+
throwExceptionFunction.accept(exc2);
194+
}
195+
}
196+
}
197+
}
198+
143199

144200
public interface Native extends SetFieldValueFunction{
145201

0 commit comments

Comments
 (0)