Skip to content

Commit 0332e6c

Browse files
committed
HV-1623 Make the fields/getters accessible lazily
1 parent edb5efd commit 0332e6c

File tree

6 files changed

+69
-17
lines changed

6 files changed

+69
-17
lines changed

engine/src/main/java/org/hibernate/validator/internal/metadata/aggregated/AbstractPropertyCascadable.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.hibernate.validator.internal.properties.Field;
1515
import org.hibernate.validator.internal.properties.Getter;
1616
import org.hibernate.validator.internal.properties.Property;
17+
import org.hibernate.validator.internal.properties.PropertyAccessor;
1718

1819
/**
1920
* A {@link Cascadable} backed by a property of a Java bean.
@@ -24,11 +25,13 @@
2425
public abstract class AbstractPropertyCascadable<T extends Property> implements Cascadable {
2526

2627
private final T property;
28+
private final PropertyAccessor propertyAccessor;
2729
private final Type cascadableType;
2830
private final CascadingMetaData cascadingMetaData;
2931

3032
AbstractPropertyCascadable(T property, CascadingMetaData cascadingMetaData) {
3133
this.property = property;
34+
this.propertyAccessor = property.createAccessor();
3235
this.cascadableType = property.getType();
3336
this.cascadingMetaData = cascadingMetaData;
3437
}
@@ -40,7 +43,7 @@ public Type getCascadableType() {
4043

4144
@Override
4245
public Object getValue(Object parent) {
43-
return property.getValueFrom( parent );
46+
return propertyAccessor.getValueFrom( parent );
4447
}
4548

4649
@Override

engine/src/main/java/org/hibernate/validator/internal/metadata/location/AbstractPropertyConstraintLocation.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
import org.hibernate.validator.internal.engine.path.PathImpl;
1212
import org.hibernate.validator.internal.properties.Property;
13+
import org.hibernate.validator.internal.properties.PropertyAccessor;
1314
import org.hibernate.validator.internal.util.ExecutableParameterNameProvider;
1415

1516
/**
@@ -25,8 +26,11 @@ public abstract class AbstractPropertyConstraintLocation<T extends Property> imp
2526
*/
2627
private final T property;
2728

29+
private final PropertyAccessor propertyAccessor;
30+
2831
AbstractPropertyConstraintLocation(T property) {
2932
this.property = property;
33+
this.propertyAccessor = property.createAccessor();
3034
}
3135

3236
@Override
@@ -55,7 +59,7 @@ public void appendTo(ExecutableParameterNameProvider parameterNameProvider, Path
5559

5660
@Override
5761
public Object getValue(Object parent) {
58-
return property.getValueFrom( parent );
62+
return propertyAccessor.getValueFrom( parent );
5963
}
6064

6165
@Override

engine/src/main/java/org/hibernate/validator/internal/properties/Property.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
*/
1212
public interface Property extends Constrainable {
1313

14-
Object getValueFrom(Object bean);
15-
1614
String getPropertyName();
15+
16+
PropertyAccessor createAccessor();
1717
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/*
2+
* Hibernate Validator, declare and validate application constraints
3+
*
4+
* License: Apache License, Version 2.0
5+
* See the license.txt file in the root directory or <http://www.apache.org/licenses/LICENSE-2.0>.
6+
*/
7+
package org.hibernate.validator.internal.properties;
8+
9+
/**
10+
* @author Guillaume Smet
11+
*/
12+
public interface PropertyAccessor {
13+
14+
Object getValueFrom(Object bean);
15+
}

engine/src/main/java/org/hibernate/validator/internal/properties/javabean/JavaBeanField.java

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import java.security.PrivilegedAction;
1616

1717
import org.hibernate.validator.HibernateValidatorPermission;
18+
import org.hibernate.validator.internal.properties.PropertyAccessor;
1819
import org.hibernate.validator.internal.util.ReflectionHelper;
1920
import org.hibernate.validator.internal.util.privilegedactions.GetDeclaredField;
2021

@@ -29,7 +30,7 @@ public class JavaBeanField implements org.hibernate.validator.internal.propertie
2930
private final Type type;
3031

3132
public JavaBeanField(Field field) {
32-
this.field = getAccessible( field );
33+
this.field = field;
3334
this.name = field.getName();
3435
this.type = ReflectionHelper.typeOf( field );
3536
this.typeForValidatorResolution = ReflectionHelper.boxedType( this.type );
@@ -55,11 +56,6 @@ public Type getTypeForValidatorResolution() {
5556
return typeForValidatorResolution;
5657
}
5758

58-
@Override
59-
public Object getValueFrom(Object bean) {
60-
return ReflectionHelper.getValue( field, bean );
61-
}
62-
6359
@Override
6460
public String getPropertyName() {
6561
return getName();
@@ -90,6 +86,11 @@ public TypeVariable<?>[] getTypeParameters() {
9086
return field.getType().getTypeParameters();
9187
}
9288

89+
@Override
90+
public PropertyAccessor createAccessor() {
91+
return new FieldAccessor( field );
92+
}
93+
9394
@Override
9495
public boolean equals(Object o) {
9596
if ( this == o ) {
@@ -127,6 +128,20 @@ public String toString() {
127128
return getName();
128129
}
129130

131+
private static class FieldAccessor implements PropertyAccessor {
132+
133+
private Field accessibleField;
134+
135+
private FieldAccessor(Field field) {
136+
this.accessibleField = getAccessible( field );
137+
}
138+
139+
@Override
140+
public Object getValueFrom(Object bean) {
141+
return ReflectionHelper.getValue( accessibleField, bean );
142+
}
143+
}
144+
130145
/**
131146
* Returns an accessible copy of the given member.
132147
*/

engine/src/main/java/org/hibernate/validator/internal/properties/javabean/JavaBeanGetter.java

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import org.hibernate.validator.HibernateValidatorPermission;
1414
import org.hibernate.validator.internal.metadata.raw.ConstrainedElement.ConstrainedElementKind;
1515
import org.hibernate.validator.internal.properties.Getter;
16+
import org.hibernate.validator.internal.properties.PropertyAccessor;
1617
import org.hibernate.validator.internal.util.ExecutableParameterNameProvider;
1718
import org.hibernate.validator.internal.util.ReflectionHelper;
1819
import org.hibernate.validator.internal.util.privilegedactions.GetDeclaredMethod;
@@ -33,22 +34,17 @@ public class JavaBeanGetter extends JavaBeanMethod implements Getter {
3334
private final Class<?> declaringClass;
3435

3536
public JavaBeanGetter(Method method) {
36-
super( getAccessible( method ) );
37+
super( method );
3738
this.name = ReflectionHelper.getPropertyName( method );
3839
this.declaringClass = method.getDeclaringClass();
3940
}
4041

4142
public JavaBeanGetter(Class<?> declaringClass, Method method) {
42-
super( getAccessible( method ) );
43+
super( method );
4344
this.name = ReflectionHelper.getPropertyName( method );
4445
this.declaringClass = declaringClass;
4546
}
4647

47-
@Override
48-
public Object getValueFrom(Object bean) {
49-
return ReflectionHelper.getValue( executable, bean );
50-
}
51-
5248
@Override
5349
public String getPropertyName() {
5450
return name;
@@ -81,6 +77,11 @@ public ConstrainedElementKind getConstrainedElementKind() {
8177
return ConstrainedElementKind.GETTER;
8278
}
8379

80+
@Override
81+
public PropertyAccessor createAccessor() {
82+
return new GetterAccessor( executable );
83+
}
84+
8485
@Override
8586
public boolean equals(Object o) {
8687
if ( this == o ) {
@@ -105,6 +106,20 @@ public int hashCode() {
105106
return result;
106107
}
107108

109+
private static class GetterAccessor implements PropertyAccessor {
110+
111+
private Method accessibleGetter;
112+
113+
private GetterAccessor(Method getter) {
114+
this.accessibleGetter = getAccessible( getter );
115+
}
116+
117+
@Override
118+
public Object getValueFrom(Object bean) {
119+
return ReflectionHelper.getValue( accessibleGetter, bean );
120+
}
121+
}
122+
108123
/**
109124
* Returns an accessible copy of the given method.
110125
*/

0 commit comments

Comments
 (0)