@@ -679,40 +679,39 @@ public void addPainlessField(Class<?> targetClass, String fieldName, Class<?> ty
679
679
"for field [[" + targetCanonicalClassName + "], [" + fieldName + "]" );
680
680
}
681
681
682
+ MethodHandle methodHandleGetter ;
683
+
684
+ try {
685
+ methodHandleGetter = MethodHandles .publicLookup ().unreflectGetter (javaField );
686
+ } catch (IllegalAccessException iae ) {
687
+ throw new IllegalArgumentException (
688
+ "getter method handle not found for field [[" + targetCanonicalClassName + "], [" + fieldName + "]]" );
689
+ }
690
+
682
691
String painlessFieldKey = buildPainlessFieldKey (fieldName );
683
692
684
693
if (Modifier .isStatic (javaField .getModifiers ())) {
685
694
if (Modifier .isFinal (javaField .getModifiers ()) == false ) {
686
- throw new IllegalArgumentException ("static field [[" + targetCanonicalClassName + "]. [" + fieldName + "]] must be final" );
695
+ throw new IllegalArgumentException ("static field [[" + targetCanonicalClassName + "], [" + fieldName + "]] must be final" );
687
696
}
688
697
689
698
PainlessField painlessField = painlessClassBuilder .staticFields .get (painlessFieldKey );
690
699
691
700
if (painlessField == null ) {
692
701
painlessField = painlessFieldCache .computeIfAbsent (
693
702
new PainlessFieldCacheKey (targetClass , fieldName , typeParameter ),
694
- key -> new PainlessField (fieldName , javaField .getName (), targetClass ,
695
- typeParameter , javaField .getModifiers (), null , null ));
703
+ key -> new PainlessField (javaField , typeParameter , methodHandleGetter , null ));
696
704
697
705
painlessClassBuilder .staticFields .put (painlessFieldKey , painlessField );
698
- } else if (painlessField .clazz != typeParameter ) {
706
+ } else if (painlessField .typeParameter != typeParameter ) {
699
707
throw new IllegalArgumentException ("cannot have static fields " +
700
708
"[[" + targetCanonicalClassName + "], [" + fieldName + "], [" +
701
709
typeToCanonicalTypeName (typeParameter ) + "] and " +
702
- "[[" + targetCanonicalClassName + "], [" + painlessField .name + "], " +
703
- typeToCanonicalTypeName (painlessField .clazz ) + "] " +
704
- "with the same and different type parameters" );
710
+ "[[" + targetCanonicalClassName + "], [" + painlessField .javaField . getName () + "], " +
711
+ typeToCanonicalTypeName (painlessField .typeParameter ) + "] " +
712
+ "with the same name and different type parameters" );
705
713
}
706
714
} else {
707
- MethodHandle methodHandleGetter ;
708
-
709
- try {
710
- methodHandleGetter = MethodHandles .publicLookup ().unreflectGetter (javaField );
711
- } catch (IllegalAccessException iae ) {
712
- throw new IllegalArgumentException (
713
- "getter method handle not found for field [[" + targetCanonicalClassName + "], [" + fieldName + "]]" );
714
- }
715
-
716
715
MethodHandle methodHandleSetter ;
717
716
718
717
try {
@@ -727,17 +726,16 @@ public void addPainlessField(Class<?> targetClass, String fieldName, Class<?> ty
727
726
if (painlessField == null ) {
728
727
painlessField = painlessFieldCache .computeIfAbsent (
729
728
new PainlessFieldCacheKey (targetClass , painlessFieldKey , typeParameter ),
730
- key -> new PainlessField (fieldName , javaField .getName (), targetClass ,
731
- typeParameter , javaField .getModifiers (), methodHandleGetter , methodHandleSetter ));
729
+ key -> new PainlessField (javaField , typeParameter , methodHandleGetter , methodHandleSetter ));
732
730
733
731
painlessClassBuilder .fields .put (fieldName , painlessField );
734
- } else if (painlessField .clazz != typeParameter ) {
732
+ } else if (painlessField .typeParameter != typeParameter ) {
735
733
throw new IllegalArgumentException ("cannot have fields " +
736
734
"[[" + targetCanonicalClassName + "], [" + fieldName + "], [" +
737
735
typeToCanonicalTypeName (typeParameter ) + "] and " +
738
- "[[" + targetCanonicalClassName + "], [" + painlessField .name + "], " +
739
- typeToCanonicalTypeName (painlessField .clazz ) + "] " +
740
- "with the same and different type parameters" );
736
+ "[[" + targetCanonicalClassName + "], [" + painlessField .javaField . getName () + "], " +
737
+ typeToCanonicalTypeName (painlessField .typeParameter ) + "] " +
738
+ "with the same name and different type parameters" );
741
739
}
742
740
}
743
741
}
@@ -812,8 +810,9 @@ private void copyPainlessClassMembers(Class<?> originalClass, Class<?> targetCla
812
810
PainlessField newPainlessField = painlessFieldEntry .getValue ();
813
811
PainlessField existingPainlessField = targetPainlessClassBuilder .fields .get (painlessFieldKey );
814
812
815
- if (existingPainlessField == null || existingPainlessField .target != newPainlessField .target &&
816
- existingPainlessField .target .isAssignableFrom (newPainlessField .target )) {
813
+ if (existingPainlessField == null ||
814
+ existingPainlessField .javaField .getDeclaringClass () != newPainlessField .javaField .getDeclaringClass () &&
815
+ existingPainlessField .javaField .getDeclaringClass ().isAssignableFrom (newPainlessField .javaField .getDeclaringClass ())) {
817
816
targetPainlessClassBuilder .fields .put (painlessFieldKey , newPainlessField );
818
817
}
819
818
}
@@ -846,8 +845,8 @@ private void cacheRuntimeHandles(PainlessClassBuilder painlessClassBuilder) {
846
845
}
847
846
848
847
for (PainlessField painlessField : painlessClassBuilder .fields .values ()) {
849
- painlessClassBuilder .getterMethodHandles .put (painlessField .name , painlessField .getter );
850
- painlessClassBuilder .setterMethodHandles .put (painlessField .name , painlessField .setter );
848
+ painlessClassBuilder .getterMethodHandles .put (painlessField .javaField . getName () , painlessField .getterMethodHandle );
849
+ painlessClassBuilder .setterMethodHandles .put (painlessField .javaField . getName () , painlessField .setterMethodHandle );
851
850
}
852
851
}
853
852
0 commit comments