Author: cbegin Date: Sun Aug 31 10:15:47 2008 New Revision: 690733 URL: http://svn.apache.org/viewvc?rev=690733&view=rev Log: fixed generic bridge methods
Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/domain/misc/generics/ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/domain/misc/generics/GenericAbstract.java ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/domain/misc/generics/GenericConcrete.java ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/domain/misc/generics/GenericInterface.java ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/domain/misc/generics/GenericSubclass.java Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/reflection/Reflector.java ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/reflection/MetaClassTest.java Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/reflection/Reflector.java URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/reflection/Reflector.java?rev=690733&r1=690732&r2=690733&view=diff ============================================================================== --- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/reflection/Reflector.java (original) +++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/reflection/Reflector.java Sun Aug 31 10:15:47 2008 @@ -59,7 +59,7 @@ } private void addGetMethods(Class cls) { - Method[] methods = getAllMethodsForClass(cls); + Method[] methods = getClassMethods(cls); for (Method method : methods) { String name = method.getName(); if (name.startsWith("get") && name.length() > 3) { @@ -85,7 +85,7 @@ private void addSetMethods(Class cls) { Map<String, List<Method>> conflictingSetters = new HashMap<String, List<Method>>(); - Method[] methods = getAllMethodsForClass(cls); + Method[] methods = getClassMethods(cls); for (Method method : methods) { String name = method.getName(); if (name.startsWith("set") && name.length() > 3) { @@ -192,19 +192,6 @@ return !(name.startsWith("$") || "serialVersionUID".equals(name) || "class".equals(name)); } - private Method[] getAllMethodsForClass(Class cls) { - if (cls.isInterface()) { - // interfaces only have public methods - so the - // simple call is all we need (this will also get superinterface methods) - return cls.getMethods(); - } else { - // need to get all the declared methods in this class - // and any super-class - then need to set access appropriatly - // for private methods - return getClassMethods(cls); - } - } - /** * This method returns an array containing all methods * declared in this class and any superclass. @@ -237,20 +224,22 @@ private void addUniqueMethods(HashMap<String, Method> uniqueMethods, Method[] methods) { for (Method currentMethod : methods) { - String signature = getSignature(currentMethod); - // check to see if the method is already known - // if it is known, then an extended class must have - // overridden a method - if (!uniqueMethods.containsKey(signature)) { - if (canAccessPrivateMethods()) { - try { - currentMethod.setAccessible(true); - } catch (Exception e) { - // Ignored. This is only a final precaution, nothing we can do. + if (!currentMethod.isBridge()) { + String signature = getSignature(currentMethod); + // check to see if the method is already known + // if it is known, then an extended class must have + // overridden a method + if (!uniqueMethods.containsKey(signature)) { + if (canAccessPrivateMethods()) { + try { + currentMethod.setAccessible(true); + } catch (Exception e) { + // Ignored. This is only a final precaution, nothing we can do. + } } - } - uniqueMethods.put(signature, currentMethod); + uniqueMethods.put(signature, currentMethod); + } } } } @@ -259,7 +248,6 @@ StringBuffer sb = new StringBuffer(); sb.append(method.getName()); Class[] parameters = method.getParameterTypes(); - for (int i = 0; i < parameters.length; i++) { if (i == 0) { sb.append(':'); @@ -268,7 +256,6 @@ } sb.append(parameters[i].getName()); } - return sb.toString(); } Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/domain/misc/generics/GenericAbstract.java URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/domain/misc/generics/GenericAbstract.java?rev=690733&view=auto ============================================================================== --- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/domain/misc/generics/GenericAbstract.java (added) +++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/domain/misc/generics/GenericAbstract.java Sun Aug 31 10:15:47 2008 @@ -0,0 +1,6 @@ +package domain.misc.generics; + +public abstract class GenericAbstract<K> { + public abstract K getId(); +} + Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/domain/misc/generics/GenericConcrete.java URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/domain/misc/generics/GenericConcrete.java?rev=690733&view=auto ============================================================================== --- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/domain/misc/generics/GenericConcrete.java (added) +++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/domain/misc/generics/GenericConcrete.java Sun Aug 31 10:15:47 2008 @@ -0,0 +1,21 @@ +package domain.misc.generics; + +public class GenericConcrete extends GenericSubclass implements GenericInterface<Long> { + private Long id; + + public Long getId() { + return id; + } + + public void setId(String id) { + this.id = Long.valueOf(id); + } + + public void setId(Long id) { + this.id = id; + } + + public void setId(Integer id) { + this.id = (long)id; + } +} Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/domain/misc/generics/GenericInterface.java URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/domain/misc/generics/GenericInterface.java?rev=690733&view=auto ============================================================================== --- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/domain/misc/generics/GenericInterface.java (added) +++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/domain/misc/generics/GenericInterface.java Sun Aug 31 10:15:47 2008 @@ -0,0 +1,5 @@ +package domain.misc.generics; + +public interface GenericInterface<K> { + void setId(K id); +} Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/domain/misc/generics/GenericSubclass.java URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/domain/misc/generics/GenericSubclass.java?rev=690733&view=auto ============================================================================== --- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/domain/misc/generics/GenericSubclass.java (added) +++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/domain/misc/generics/GenericSubclass.java Sun Aug 31 10:15:47 2008 @@ -0,0 +1,9 @@ +package domain.misc.generics; + +public abstract class GenericSubclass extends GenericAbstract<Long> { + public abstract Long getId(); +} + + + + Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/reflection/MetaClassTest.java URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/reflection/MetaClassTest.java?rev=690733&r1=690732&r2=690733&view=diff ============================================================================== --- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/reflection/MetaClassTest.java (original) +++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/reflection/MetaClassTest.java Sun Aug 31 10:15:47 2008 @@ -1,6 +1,7 @@ package org.apache.ibatis.reflection; import domain.misc.RichType; +import domain.misc.generics.GenericConcrete; import org.junit.*; import java.util.*; @@ -14,14 +15,20 @@ } }; - private MetaClass meta = MetaClass.forClass(RichType.class); - public MetaClassTest() { rich.setRichType(new RichType()); } @Test + public void shouldTestDataTypeOfGenericMethod() { + MetaClass meta = MetaClass.forClass(GenericConcrete.class); + Assert.assertEquals(Long.class, meta.getGetterType("id")); + Assert.assertEquals(Long.class, meta.getSetterType("id")); + } + + @Test public void shouldCheckGetterExistance() { + MetaClass meta = MetaClass.forClass(RichType.class); Assert.assertTrue(meta.hasGetter("richField")); Assert.assertTrue(meta.hasGetter("richProperty")); Assert.assertTrue(meta.hasGetter("richList")); @@ -40,6 +47,7 @@ @Test public void shouldCheckSetterExistance() { + MetaClass meta = MetaClass.forClass(RichType.class); Assert.assertTrue(meta.hasSetter("richField")); Assert.assertTrue(meta.hasSetter("richProperty")); Assert.assertTrue(meta.hasSetter("richList")); @@ -58,6 +66,7 @@ @Test public void shouldCheckTypeForEachGetter() { + MetaClass meta = MetaClass.forClass(RichType.class); Assert.assertEquals(String.class, meta.getGetterType("richField")); Assert.assertEquals(String.class, meta.getGetterType("richProperty")); Assert.assertEquals(List.class, meta.getGetterType("richList")); @@ -74,6 +83,7 @@ @Test public void shouldCheckTypeForEachSetter() { + MetaClass meta = MetaClass.forClass(RichType.class); Assert.assertEquals(String.class, meta.getSetterType("richField")); Assert.assertEquals(String.class, meta.getSetterType("richProperty")); Assert.assertEquals(List.class, meta.getSetterType("richList")); @@ -90,12 +100,14 @@ @Test public void shouldCheckGetterAndSetterNames() { + MetaClass meta = MetaClass.forClass(RichType.class); Assert.assertEquals(5, meta.getGetterNames().length); Assert.assertEquals(5, meta.getSetterNames().length); } @Test public void shouldFindPropertyName() { + MetaClass meta = MetaClass.forClass(RichType.class); Assert.assertEquals("richField", meta.findProperty("RICHfield")); }