Skip to content

Commit 4df2ead

Browse files
Alexandre Dutraolim7t
authored andcommitted
Explicitly test if objects are accessible through reflection.
1 parent 7ef3109 commit 4df2ead

2 files changed

Lines changed: 23 additions & 11 deletions

File tree

driver-mapping/src/main/java/com/datastax/driver/mapping/PropertyMapper.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,17 @@ class PropertyMapper {
5858
getter = ReflectionUtils.findGetter(property);
5959
setter = ReflectionUtils.findSetter(property);
6060
annotations = ReflectionUtils.scanPropertyAnnotations(field, property);
61+
if (field != null)
62+
ReflectionUtils.tryMakeAccessible(field);
63+
if (getter != null)
64+
ReflectionUtils.tryMakeAccessible(getter);
65+
if (setter != null)
66+
ReflectionUtils.tryMakeAccessible(setter);
6167
if (!isTransient()) {
62-
checkState(field != null || getter != null, "Property '%s' is not readable", propertyName);
63-
checkState(field != null || setter != null, "Property '%s' is not writable", propertyName);
68+
checkState((field != null && field.isAccessible()) || (getter != null && getter.isAccessible()),
69+
"Property '%s' is not readable", propertyName);
70+
checkState((field != null && field.isAccessible()) || (setter != null && setter.isAccessible()),
71+
"Property '%s' is not writable", propertyName);
6472
}
6573
columnName = inferColumnName();
6674
position = inferPosition();
@@ -71,7 +79,7 @@ class PropertyMapper {
7179
Object getValue(Object entity) {
7280
try {
7381
// try getter first, if available, otherwise direct field access
74-
if (getter != null)
82+
if (getter != null && getter.isAccessible())
7583
return getter.invoke(entity);
7684
else
7785
return field.get(entity);
@@ -83,7 +91,7 @@ Object getValue(Object entity) {
8391
void setValue(Object entity, Object value) {
8492
try {
8593
// try setter first, if available, otherwise direct field access
86-
if (setter != null)
94+
if (setter != null && setter.isAccessible())
8795
setter.invoke(entity, value);
8896
else
8997
field.set(entity, value);

driver-mapping/src/main/java/com/datastax/driver/mapping/ReflectionUtils.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,7 @@
2222
import java.beans.Introspector;
2323
import java.beans.PropertyDescriptor;
2424
import java.lang.annotation.Annotation;
25-
import java.lang.reflect.Constructor;
26-
import java.lang.reflect.Field;
27-
import java.lang.reflect.Method;
28-
import java.lang.reflect.Modifier;
25+
import java.lang.reflect.*;
2926
import java.util.HashMap;
3027
import java.util.Map;
3128

@@ -80,7 +77,6 @@ private static <T> Map<String, Field> scanFields(Class<T> baseClass) {
8077
for (Field field : clazz.getDeclaredFields()) {
8178
if (field.getName().equals("class") || field.isSynthetic() || (field.getModifiers() & Modifier.STATIC) == Modifier.STATIC)
8279
continue;
83-
field.setAccessible(true);
8480
// never override a more specific field masking another one declared in a superclass
8581
if (!fields.containsKey(field.getName()))
8682
fields.put(field.getName(), field);
@@ -161,7 +157,6 @@ static Method findGetter(PropertyDescriptor property) {
161157
Method getter = property.getReadMethod();
162158
if (getter == null)
163159
return null;
164-
getter.setAccessible(true);
165160
return getter;
166161
}
167162

@@ -171,8 +166,17 @@ static Method findSetter(PropertyDescriptor property) {
171166
Method setter = property.getWriteMethod();
172167
if (setter == null)
173168
return null;
174-
setter.setAccessible(true);
175169
return setter;
176170
}
177171

172+
static void tryMakeAccessible(AccessibleObject object) {
173+
if (!object.isAccessible()) {
174+
try {
175+
object.setAccessible(true);
176+
} catch (SecurityException e) {
177+
// ok
178+
}
179+
}
180+
}
181+
178182
}

0 commit comments

Comments
 (0)