Skip to content

Commit db52592

Browse files
mp911deodrotbohm
authored andcommitted
DATACMNS-853 - Support interface entity types using generated property accessors.
Property accessors (getter and setter) defined on an interface require a different instruction opcode for invoking methods. We now distinguish whether a property accessor is defined on an interface and use either INVOKEINTERFACE or INVOKEVIRTUAL otherwise. Related tickets: DATACMNS-809. Original pull request: #161. Related pull request: #160.
1 parent 08e8f15 commit db52592

File tree

1 file changed

+22
-4
lines changed

1 file changed

+22
-4
lines changed

src/main/java/org/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactory.java

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -876,8 +876,17 @@ private static void visitGetProperty0(PersistentEntity<?, ?> entity, PersistentP
876876
} else {
877877
// bean.get...
878878
mv.visitVarInsn(ALOAD, 2);
879-
mv.visitMethodInsn(INVOKEVIRTUAL, Type.getInternalName(getter.getDeclaringClass()), getter.getName(),
880-
String.format("()%s", signatureTypeName(getter.getReturnType())), false);
879+
880+
int invokeOpCode = INVOKEVIRTUAL;
881+
Class<?> declaringClass = getter.getDeclaringClass();
882+
boolean interfaceDefinition = declaringClass.isInterface();
883+
884+
if(interfaceDefinition){
885+
invokeOpCode = INVOKEINTERFACE;
886+
}
887+
888+
mv.visitMethodInsn(invokeOpCode, Type.getInternalName(declaringClass), getter.getName(),
889+
String.format("()%s", signatureTypeName(getter.getReturnType())), interfaceDefinition);
881890
autoboxIfNeeded(getter.getReturnType(), autoboxType(getter.getReturnType()), mv);
882891
}
883892
} else {
@@ -1051,8 +1060,17 @@ private static void visitSetProperty0(PersistentEntity<?, ?> entity, PersistentP
10511060
Class<?> parameterType = setter.getParameterTypes()[0];
10521061
mv.visitTypeInsn(CHECKCAST, Type.getInternalName(autoboxType(parameterType)));
10531062
autoboxIfNeeded(autoboxType(parameterType), parameterType, mv);
1054-
mv.visitMethodInsn(INVOKEVIRTUAL, Type.getInternalName(setter.getDeclaringClass()), setter.getName(),
1055-
String.format("(%s)V", signatureTypeName(parameterType)), false);
1063+
1064+
int invokeOpCode = INVOKEVIRTUAL;
1065+
Class<?> declaringClass = setter.getDeclaringClass();
1066+
boolean interfaceDefinition = declaringClass.isInterface();
1067+
1068+
if(interfaceDefinition){
1069+
invokeOpCode = INVOKEINTERFACE;
1070+
}
1071+
1072+
mv.visitMethodInsn(invokeOpCode, Type.getInternalName(setter.getDeclaringClass()), setter.getName(),
1073+
String.format("(%s)V", signatureTypeName(parameterType)), interfaceDefinition);
10561074
}
10571075
} else {
10581076

0 commit comments

Comments
 (0)