@@ -679,40 +679,39 @@ public void addPainlessField(Class<?> targetClass, String fieldName, Class<?> ty
679679 "for field [[" + targetCanonicalClassName + "], [" + fieldName + "]" );
680680 }
681681
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+
682691 String painlessFieldKey = buildPainlessFieldKey (fieldName );
683692
684693 if (Modifier .isStatic (javaField .getModifiers ())) {
685694 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" );
687696 }
688697
689698 PainlessField painlessField = painlessClassBuilder .staticFields .get (painlessFieldKey );
690699
691700 if (painlessField == null ) {
692701 painlessField = painlessFieldCache .computeIfAbsent (
693702 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 ));
696704
697705 painlessClassBuilder .staticFields .put (painlessFieldKey , painlessField );
698- } else if (painlessField .clazz != typeParameter ) {
706+ } else if (painlessField .typeParameter != typeParameter ) {
699707 throw new IllegalArgumentException ("cannot have static fields " +
700708 "[[" + targetCanonicalClassName + "], [" + fieldName + "], [" +
701709 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" );
705713 }
706714 } 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-
716715 MethodHandle methodHandleSetter ;
717716
718717 try {
@@ -727,17 +726,16 @@ public void addPainlessField(Class<?> targetClass, String fieldName, Class<?> ty
727726 if (painlessField == null ) {
728727 painlessField = painlessFieldCache .computeIfAbsent (
729728 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 ));
732730
733731 painlessClassBuilder .fields .put (fieldName , painlessField );
734- } else if (painlessField .clazz != typeParameter ) {
732+ } else if (painlessField .typeParameter != typeParameter ) {
735733 throw new IllegalArgumentException ("cannot have fields " +
736734 "[[" + targetCanonicalClassName + "], [" + fieldName + "], [" +
737735 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" );
741739 }
742740 }
743741 }
@@ -812,8 +810,9 @@ private void copyPainlessClassMembers(Class<?> originalClass, Class<?> targetCla
812810 PainlessField newPainlessField = painlessFieldEntry .getValue ();
813811 PainlessField existingPainlessField = targetPainlessClassBuilder .fields .get (painlessFieldKey );
814812
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 ())) {
817816 targetPainlessClassBuilder .fields .put (painlessFieldKey , newPainlessField );
818817 }
819818 }
@@ -846,8 +845,8 @@ private void cacheRuntimeHandles(PainlessClassBuilder painlessClassBuilder) {
846845 }
847846
848847 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 );
851850 }
852851 }
853852
0 commit comments