@@ -384,7 +384,7 @@ static Class<?> generateCustomAccessorClass(PersistentEntity<?, ?> entity) {
384
384
static byte [] generateBytecode (String internalClassName , PersistentEntity <?, ?> entity ) {
385
385
386
386
ClassWriter cw = new ClassWriter (ClassWriter .COMPUTE_MAXS );
387
- cw .visit (Opcodes .V1_6 , ACC_PUBLIC + ACC_SUPER , internalClassName , null , JAVA_LANG_OBJECT , IMPLEMENTED_INTERFACES );
387
+ cw .visit (Opcodes .V1_8 , ACC_PUBLIC + ACC_SUPER , internalClassName , null , JAVA_LANG_OBJECT , IMPLEMENTED_INTERFACES );
388
388
389
389
List <PersistentProperty <?>> persistentProperties = getPersistentProperties (entity );
390
390
@@ -778,19 +778,18 @@ private static void visitBeanGetter(PersistentEntity<?, ?> entity, String intern
778
778
*
779
779
* <pre class="code">
780
780
* public Object getProperty(PersistentProperty<?> property) {
781
- * Object bean = this.bean;
782
781
* switch (property.getName().hashCode()) {
783
782
* case 3355:
784
- * return id_fieldGetter.invoke(bean);
783
+ * return id_fieldGetter.invoke(this. bean);
785
784
* case 3356:
786
- * return bean.getField();
785
+ * return this. bean.getField();
787
786
* // ...
788
787
* case 3357:
789
- * return bean.field;
788
+ * return this. bean.field;
790
789
* // ...
791
790
* }
792
791
* throw new UnsupportedOperationException(
793
- * String.format("No MethodHandle to get property %s", new Object[] { property }));
792
+ * String.format("No accessor to get property %s", new Object[] { property }));
794
793
* }
795
794
* </pre>
796
795
*/
@@ -809,12 +808,6 @@ private static void visitGetProperty(PersistentEntity<?, ?> entity,
809
808
// Assert.notNull(property)
810
809
visitAssertNotNull (mv );
811
810
812
- mv .visitVarInsn (ALOAD , 0 );
813
-
814
- mv .visitFieldInsn (GETFIELD , internalClassName , BEAN_FIELD , getAccessibleTypeReferenceName (entity ));
815
-
816
- mv .visitVarInsn (ASTORE , 2 );
817
-
818
811
visitGetPropertySwitch (entity , persistentProperties , internalClassName , mv );
819
812
820
813
mv .visitLabel (l1 );
@@ -824,8 +817,6 @@ private static void visitGetProperty(PersistentEntity<?, ?> entity,
824
817
mv .visitLocalVariable ("property" , referenceName (PERSISTENT_PROPERTY ),
825
818
"Lorg/springframework/data/mapping/PersistentProperty<*>;" , l0 , l1 , 1 );
826
819
827
- mv .visitLocalVariable (BEAN_FIELD , getAccessibleTypeReferenceName (entity ), null , l0 , l1 , 2 );
828
-
829
820
mv .visitMaxs (0 , 0 );
830
821
mv .visitEnd ();
831
822
}
@@ -894,12 +885,14 @@ private static void visitGetProperty0(PersistentEntity<?, ?> entity, PersistentP
894
885
// $getter.invoke(bean)
895
886
mv .visitFieldInsn (GETSTATIC , internalClassName , getterName (property ),
896
887
referenceName (JAVA_LANG_INVOKE_METHOD_HANDLE ));
897
- mv .visitVarInsn (ALOAD , 2 );
888
+ mv .visitVarInsn (ALOAD , 0 );
889
+ mv .visitFieldInsn (GETFIELD , internalClassName , BEAN_FIELD , getAccessibleTypeReferenceName (entity ));
898
890
mv .visitMethodInsn (INVOKEVIRTUAL , JAVA_LANG_INVOKE_METHOD_HANDLE , "invoke" ,
899
891
String .format ("(%s)%s" , referenceName (JAVA_LANG_OBJECT ), referenceName (JAVA_LANG_OBJECT )), false );
900
892
} else {
901
893
// bean.get...
902
- mv .visitVarInsn (ALOAD , 2 );
894
+ mv .visitVarInsn (ALOAD , 0 );
895
+ mv .visitFieldInsn (GETFIELD , internalClassName , BEAN_FIELD , getAccessibleTypeReferenceName (entity ));
903
896
904
897
int invokeOpCode = INVOKEVIRTUAL ;
905
898
Class <?> declaringClass = getter .getDeclaringClass ();
@@ -921,12 +914,14 @@ private static void visitGetProperty0(PersistentEntity<?, ?> entity, PersistentP
921
914
// $fieldGetter.invoke(bean)
922
915
mv .visitFieldInsn (GETSTATIC , internalClassName , fieldGetterName (property ),
923
916
referenceName (JAVA_LANG_INVOKE_METHOD_HANDLE ));
924
- mv .visitVarInsn (ALOAD , 2 );
917
+ mv .visitVarInsn (ALOAD , 0 );
918
+ mv .visitFieldInsn (GETFIELD , internalClassName , BEAN_FIELD , getAccessibleTypeReferenceName (entity ));
925
919
mv .visitMethodInsn (INVOKEVIRTUAL , JAVA_LANG_INVOKE_METHOD_HANDLE , "invoke" ,
926
920
String .format ("(%s)%s" , referenceName (JAVA_LANG_OBJECT ), referenceName (JAVA_LANG_OBJECT )), false );
927
921
} else {
928
922
// bean.field
929
- mv .visitVarInsn (ALOAD , 2 );
923
+ mv .visitVarInsn (ALOAD , 0 );
924
+ mv .visitFieldInsn (GETFIELD , internalClassName , BEAN_FIELD , getAccessibleTypeReferenceName (entity ));
930
925
mv .visitFieldInsn (GETFIELD , Type .getInternalName (field .getDeclaringClass ()), field .getName (),
931
926
signatureTypeName (field .getType ()));
932
927
autoboxIfNeeded (field .getType (), autoboxType (field .getType ()), mv );
@@ -941,19 +936,18 @@ private static void visitGetProperty0(PersistentEntity<?, ?> entity, PersistentP
941
936
*
942
937
* <pre class="code">
943
938
* public void setProperty(PersistentProperty<?> property, Optional<? extends Object> value) {
944
- * Object bean = this.bean;
945
939
* switch (property.getName().hashCode()) {
946
940
* case 3355:
947
- * $id_fieldSetter.invoke(bean, value);
941
+ * $id_fieldSetter.invoke(this. bean, value);
948
942
* return;
949
943
* case 3357:
950
- * this.bean = $id_fieldWither.invoke(bean, value);
944
+ * this.bean = $id_fieldWither.invoke(this. bean, value);
951
945
* return;
952
946
* case 3358:
953
- * this.bean = bean.withId(value);
947
+ * this.bean = this. bean.withId(value);
954
948
* return;
955
949
* case 3359:
956
- * this.bean = PersonWithId.copy$default(bean, value, 0, null); // Kotlin
950
+ * this.bean = PersonWithId.copy$default(this. bean, value, 0, null); // Kotlin
957
951
* return;
958
952
* // ...
959
953
* }
@@ -975,12 +969,6 @@ private static void visitSetProperty(PersistentEntity<?, ?> entity,
975
969
976
970
visitAssertNotNull (mv );
977
971
978
- mv .visitVarInsn (ALOAD , 0 );
979
-
980
- mv .visitFieldInsn (GETFIELD , internalClassName , BEAN_FIELD , getAccessibleTypeReferenceName (entity ));
981
-
982
- mv .visitVarInsn (ASTORE , 3 );
983
-
984
972
visitSetPropertySwitch (entity , persistentProperties , internalClassName , mv );
985
973
986
974
Label l1 = new Label ();
@@ -993,8 +981,6 @@ private static void visitSetProperty(PersistentEntity<?, ?> entity,
993
981
"Lorg/springframework/data/mapping/PersistentProperty<*>;" , l0 , l1 , 1 );
994
982
mv .visitLocalVariable ("value" , referenceName (JAVA_LANG_OBJECT ), null , l0 , l1 , 2 );
995
983
996
- mv .visitLocalVariable (BEAN_FIELD , getAccessibleTypeReferenceName (entity ), null , l0 , l1 , 3 );
997
-
998
984
mv .visitMaxs (0 , 0 );
999
985
mv .visitEnd ();
1000
986
}
@@ -1089,15 +1075,17 @@ private static void visitSetProperty0(PersistentEntity<?, ?> entity, PersistentP
1089
1075
private static void visitWithProperty (PersistentEntity <?, ?> entity , PersistentProperty <?> property ,
1090
1076
MethodVisitor mv , String internalClassName , Method wither ) {
1091
1077
1092
- if (generateMethodHandle (entity , wither )) {
1078
+ // this. <- for later PUTFIELD
1079
+ mv .visitVarInsn (ALOAD , 0 );
1093
1080
1094
- // this. <- for later PUTFIELD
1095
- mv .visitVarInsn (ALOAD , 0 );
1081
+ if (generateMethodHandle (entity , wither )) {
1096
1082
1097
1083
// $wither.invoke(bean)
1098
1084
mv .visitFieldInsn (GETSTATIC , internalClassName , witherName (property ),
1099
1085
referenceName (JAVA_LANG_INVOKE_METHOD_HANDLE ));
1100
- mv .visitVarInsn (ALOAD , 3 );
1086
+ mv .visitVarInsn (ALOAD , 0 );
1087
+ mv .visitFieldInsn (GETFIELD , internalClassName , BEAN_FIELD , getAccessibleTypeReferenceName (entity ));
1088
+
1101
1089
mv .visitVarInsn (ALOAD , 2 );
1102
1090
mv .visitMethodInsn (INVOKEVIRTUAL , JAVA_LANG_INVOKE_METHOD_HANDLE , "invoke" , String .format ("(%s%s)%s" ,
1103
1091
referenceName (JAVA_LANG_OBJECT ), referenceName (JAVA_LANG_OBJECT ), getAccessibleTypeReferenceName (entity )),
@@ -1107,11 +1095,9 @@ private static void visitWithProperty(PersistentEntity<?, ?> entity, PersistentP
1107
1095
}
1108
1096
} else {
1109
1097
1110
- // this. <- for later PUTFIELD
1098
+ // this.bean.set...(object)
1111
1099
mv .visitVarInsn (ALOAD , 0 );
1112
-
1113
- // bean.set...(object)
1114
- mv .visitVarInsn (ALOAD , 3 );
1100
+ mv .visitFieldInsn (GETFIELD , internalClassName , BEAN_FIELD , getAccessibleTypeReferenceName (entity ));
1115
1101
mv .visitVarInsn (ALOAD , 2 );
1116
1102
1117
1103
visitInvokeMethodSingleArg (mv , wither );
@@ -1146,7 +1132,8 @@ private static void visitKotlinCopy(PersistentEntity<?, ?> entity, PersistentPro
1146
1132
if (kotlinCopyMethod .shouldUsePublicCopyMethod (entity )) {
1147
1133
1148
1134
// PersonWithId.copy$(value)
1149
- mv .visitVarInsn (ALOAD , 3 );
1135
+ mv .visitVarInsn (ALOAD , 0 );
1136
+ mv .visitFieldInsn (GETFIELD , internalClassName , BEAN_FIELD , getAccessibleTypeReferenceName (entity ));
1150
1137
mv .visitVarInsn (ALOAD , 2 );
1151
1138
1152
1139
visitInvokeMethodSingleArg (mv , kotlinCopyMethod .getPublicCopyMethod ());
@@ -1155,8 +1142,9 @@ private static void visitKotlinCopy(PersistentEntity<?, ?> entity, PersistentPro
1155
1142
Method copy = kotlinCopyMethod .getSyntheticCopyMethod ();
1156
1143
Class <?>[] parameterTypes = copy .getParameterTypes ();
1157
1144
1158
- // PersonWithId.copy$default..(bean, object, MASK, null)
1159
- mv .visitVarInsn (ALOAD , 3 );
1145
+ // PersonWithId.copy$default..(this.bean, object, MASK, null)
1146
+ mv .visitVarInsn (ALOAD , 0 );
1147
+ mv .visitFieldInsn (GETFIELD , internalClassName , BEAN_FIELD , getAccessibleTypeReferenceName (entity ));
1160
1148
1161
1149
KotlinCopyMethod .KotlinCopyByProperty copyByProperty = kotlinCopyMethod .forProperty (property )
1162
1150
.orElseThrow (() -> new IllegalStateException (
@@ -1200,25 +1188,27 @@ private static void visitKotlinCopy(PersistentEntity<?, ?> entity, PersistentPro
1200
1188
* or
1201
1189
*
1202
1190
* <pre class="code">
1203
- * bean.setId(value);
1191
+ * this. bean.setId(value);
1204
1192
* </pre>
1205
1193
*/
1206
1194
private static void visitSetProperty (PersistentEntity <?, ?> entity , PersistentProperty <?> property ,
1207
1195
MethodVisitor mv , String internalClassName , Method setter ) {
1208
1196
1209
1197
if (generateMethodHandle (entity , setter )) {
1210
1198
1211
- // $setter.invoke(bean)
1199
+ // $setter.invoke(this. bean)
1212
1200
mv .visitFieldInsn (GETSTATIC , internalClassName , setterName (property ),
1213
1201
referenceName (JAVA_LANG_INVOKE_METHOD_HANDLE ));
1214
- mv .visitVarInsn (ALOAD , 3 );
1202
+ mv .visitVarInsn (ALOAD , 0 );
1203
+ mv .visitFieldInsn (GETFIELD , internalClassName , BEAN_FIELD , getAccessibleTypeReferenceName (entity ));
1215
1204
mv .visitVarInsn (ALOAD , 2 );
1216
1205
mv .visitMethodInsn (INVOKEVIRTUAL , JAVA_LANG_INVOKE_METHOD_HANDLE , "invoke" ,
1217
1206
String .format ("(%s%s)V" , referenceName (JAVA_LANG_OBJECT ), referenceName (JAVA_LANG_OBJECT )), false );
1218
1207
} else {
1219
1208
1220
- // bean.set...(object)
1221
- mv .visitVarInsn (ALOAD , 3 );
1209
+ // this.bean.set...(object)
1210
+ mv .visitVarInsn (ALOAD , 0 );
1211
+ mv .visitFieldInsn (GETFIELD , internalClassName , BEAN_FIELD , getAccessibleTypeReferenceName (entity ));
1222
1212
mv .visitVarInsn (ALOAD , 2 );
1223
1213
1224
1214
visitInvokeMethodSingleArg (mv , setter );
@@ -1229,7 +1219,7 @@ private static void visitSetProperty(PersistentEntity<?, ?> entity, PersistentPr
1229
1219
* Generate:
1230
1220
*
1231
1221
* <pre class="code">
1232
- * $id_fieldSetter.invoke(bean, value);
1222
+ * $id_fieldSetter.invoke(this. bean, value);
1233
1223
* </pre>
1234
1224
*
1235
1225
* or
@@ -1244,16 +1234,18 @@ private static void visitSetField(PersistentEntity<?, ?> entity, PersistentPrope
1244
1234
Field field = property .getField ();
1245
1235
if (field != null ) {
1246
1236
if (generateSetterMethodHandle (entity , field )) {
1247
- // $fieldSetter.invoke(bean, object)
1237
+ // $fieldSetter.invoke(this. bean, object)
1248
1238
mv .visitFieldInsn (GETSTATIC , internalClassName , fieldSetterName (property ),
1249
1239
referenceName (JAVA_LANG_INVOKE_METHOD_HANDLE ));
1250
- mv .visitVarInsn (ALOAD , 3 );
1240
+ mv .visitVarInsn (ALOAD , 0 );
1241
+ mv .visitFieldInsn (GETFIELD , internalClassName , BEAN_FIELD , getAccessibleTypeReferenceName (entity ));
1251
1242
mv .visitVarInsn (ALOAD , 2 );
1252
1243
mv .visitMethodInsn (INVOKEVIRTUAL , JAVA_LANG_INVOKE_METHOD_HANDLE , "invoke" ,
1253
1244
String .format ("(%s%s)V" , referenceName (JAVA_LANG_OBJECT ), referenceName (JAVA_LANG_OBJECT )), false );
1254
1245
} else {
1255
- // bean.field
1256
- mv .visitVarInsn (ALOAD , 3 );
1246
+ // this.bean.field
1247
+ mv .visitVarInsn (ALOAD , 0 );
1248
+ mv .visitFieldInsn (GETFIELD , internalClassName , BEAN_FIELD , getAccessibleTypeReferenceName (entity ));
1257
1249
mv .visitVarInsn (ALOAD , 2 );
1258
1250
1259
1251
Class <?> fieldType = field .getType ();
0 commit comments