Skip to content

Commit 0378316

Browse files
Writing final fields per reflection is not possible anymore
1 parent b483371 commit 0378316

21 files changed

+242
-351
lines changed

spring-data-eclipse-store/pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,7 @@
298298
--add-opens java.base/java.lang=ALL-UNNAMED
299299
--add-opens=java.base/java.lang.reflect=ALL-UNNAMED
300300
--add-exports java.base/jdk.internal.misc=ALL-UNNAMED
301+
-Djdk.reflect.useDirectMethodHandle=false
301302
</argLine>
302303
</configuration>
303304
</plugin>
Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,12 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16-
package software.xdev.spring.data.eclipse.store.repository.access.modifier;
16+
package software.xdev.spring.data.eclipse.store.exceptions;
1717

18-
/**
19-
* Provides a way to open member variables (fields) to changes.
20-
*/
21-
public interface FieldAccessModifierToEditable<E> extends FieldAccessModifier<E>
18+
public class IdFieldFinalException extends RuntimeException
2219
{
23-
void writeValueOfField(E objectOfFieldToWriteTo, Object valueToWrite) throws IllegalAccessException;
20+
public IdFieldFinalException(final String message)
21+
{
22+
super(message);
23+
}
2424
}

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/exceptions/MergeFailedException.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@ public MergeFailedException(final Object sourceObject, final Object targetObject
2121
{
2222
super(
2323
String.format(
24-
"Could not merge values of object %s with object %s",
25-
sourceObject.toString(),
26-
targetObject.toString()
24+
"Could not merge values of object %s# with object %s",
25+
sourceObject.getClass().getName(),
26+
targetObject.getClass().getName()
2727
),
2828
e
2929
);

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/EclipseStoreStorage.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,14 @@
4343

4444

4545
@Component
46-
public class EclipseStoreStorage implements EntityListProvider, IdSetterProvider, PersistableChecker
46+
public class EclipseStoreStorage
47+
implements EntityListProvider, IdSetterProvider, PersistableChecker
4748
{
4849
private static final Logger LOG = LoggerFactory.getLogger(EclipseStoreStorage.class);
4950
private final Map<Class<?>, String> entityClassToRepositoryName = new HashMap<>();
5051
private final Map<Class<?>, IdSetter<?>> entityClassToIdSetter = new HashMap<>();
5152
private EntitySetCollector entitySetCollector;
5253
private PersistableChecker persistenceChecker;
53-
5454
private final EclipseStoreProperties storeConfiguration;
5555
private final EclipseStoreProvider storeProvider;
5656

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/access/modifier/FieldAccessModifier.java

Lines changed: 2 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -16,60 +16,21 @@
1616
package software.xdev.spring.data.eclipse.store.repository.access.modifier;
1717

1818
import java.lang.reflect.Field;
19-
import java.lang.reflect.InvocationTargetException;
2019
import java.util.Objects;
21-
import java.util.concurrent.atomic.AtomicInteger;
2220

2321

2422
/**
2523
* Provides a way to open member variables (fields) to changes.
2624
*/
2725
public interface FieldAccessModifier<E> extends AutoCloseable
2826
{
29-
AtomicInteger javaVersion = new AtomicInteger(0);
30-
31-
static <T> FieldAccessModifierToEditable<T> makeFieldEditable(final Field field, final T sourceObject)
32-
throws InvocationTargetException, IllegalAccessException
33-
{
34-
if(javaVersion.get() == 0)
35-
{
36-
javaVersion.set(getJavaVersion());
37-
}
38-
if(javaVersion.get() < 18)
39-
{
40-
return new FieldEditableMakerForJavaLowerThan18<>(
41-
Objects.requireNonNull(field),
42-
Objects.requireNonNull(sourceObject)
43-
);
44-
}
45-
return new FieldEditableMakerForJavaHigherOrEqualTo18<>(
46-
Objects.requireNonNull(field),
47-
Objects.requireNonNull(sourceObject)
48-
);
49-
}
50-
5127
static <T> FieldAccessModifier<T> makeFieldReadable(final Field field, final T sourceObject)
5228
{
5329
return new FieldAccessibleMaker<>(Objects.requireNonNull(field), Objects.requireNonNull(sourceObject));
5430
}
5531

5632
Object getValueOfField(E objectOfFieldToRead) throws IllegalAccessException;
5733

58-
private static int getJavaVersion()
59-
{
60-
String version = System.getProperty("java.version");
61-
if(version.startsWith("1."))
62-
{
63-
version = version.substring(2, 3);
64-
}
65-
else
66-
{
67-
final int dot = version.indexOf(".");
68-
if(dot != -1)
69-
{
70-
version = version.substring(0, dot);
71-
}
72-
}
73-
return Integer.parseInt(version);
74-
}
34+
void writeValueOfField(E objectOfFieldToWriteTo, Object valueToWrite, boolean throwExceptionIfFinal)
35+
throws IllegalAccessException;
7536
}

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/access/modifier/FieldAccessibleMaker.java

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
package software.xdev.spring.data.eclipse.store.repository.access.modifier;
1717

1818
import java.lang.reflect.Field;
19+
import java.lang.reflect.Modifier;
20+
import java.util.Objects;
1921

2022
import org.slf4j.Logger;
2123
import org.slf4j.LoggerFactory;
@@ -36,11 +38,14 @@ public class FieldAccessibleMaker<E> implements FieldAccessModifier<E>
3638
private static final Logger LOG = LoggerFactory.getLogger(FieldAccessibleMaker.class);
3739
private final Field field;
3840
private final boolean wasAccessible;
41+
private final boolean isFinal;
3942

4043
FieldAccessibleMaker(final Field field, final E sourceObject)
4144
{
4245
this.field = field;
43-
this.wasAccessible = field.canAccess(sourceObject);
46+
this.wasAccessible = field.canAccess(Objects.requireNonNull(sourceObject));
47+
final int fieldModifiers = field.getModifiers();
48+
this.isFinal = Modifier.isFinal(fieldModifiers);
4449
if(!this.wasAccessible)
4550
{
4651
if(LOG.isTraceEnabled())
@@ -60,6 +65,27 @@ public Object getValueOfField(final E objectOfFieldToRead) throws IllegalAccessE
6065
return this.field.get(objectOfFieldToRead);
6166
}
6267

68+
@Override
69+
public void writeValueOfField(
70+
final E objectOfFieldToWriteTo,
71+
final Object valueToWrite,
72+
final boolean throwExceptionIfFinal)
73+
throws IllegalAccessException
74+
{
75+
if(throwExceptionIfFinal && this.isFinal)
76+
{
77+
throw new IllegalAccessException(String.format(
78+
"Field %s:%s is final and cannot be modified. Make the field not final.",
79+
objectOfFieldToWriteTo.toString(), this.field.getName()));
80+
}
81+
this.field.set(objectOfFieldToWriteTo, valueToWrite);
82+
}
83+
84+
public boolean isFinal()
85+
{
86+
return this.isFinal;
87+
}
88+
6389
@Override
6490
public void close()
6591
{

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/access/modifier/FieldEditableMakerForJavaHigherOrEqualTo18.java

Lines changed: 0 additions & 146 deletions
This file was deleted.

0 commit comments

Comments
 (0)