velocity-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Leon sdh5724 <>
Subject A bug in class ClassMap
Date Thu, 05 Feb 2009 15:32:36 GMT
 Hi devs,
    when we upgrade to velocity1.6.1. But the process failed. we found a
critical bug in velocity1.6.1 . I have mock the bug in details:

    First step:

public interface ITestBean2{

     String getName();

public interface ITestBean extends ITestBean2 {


private static  class TestBean implements ITestBean {
        private String name = "test bean method name";
        public String getName() {
            return name;

   then  set up velocity excute template code:

   context.put("testBean", new TestBean());

   We found $testBean.getName() can not be rendered.The template can be
rendered in version1.4.  Then I debug several hours(I never read velocity
code before), we found a bug in class
org.apache.velocity.util.introspection.ClassMap::createMethodCache() .  Code
"classToReflect.getInterfaces() " is not correct used, Class.getInterfaces()
Can *ONLY* get parent interfaces,  it  can not get a super super interface.
So Code "createMethodCache()" missed a interface check.

Leon Liu
 private MethodCache createMethodCache()
        MethodCache methodCache = new MethodCache(log);
        for (Class classToReflect = getCachedClass(); classToReflect != null
; classToReflect = classToReflect.getSuperclass())
            if (Modifier.isPublic(classToReflect.getModifiers()))
                populateMethodCacheWith(methodCache, classToReflect);
            *Class [] interfaces = classToReflect.getInterfaces();*
            for (int i = 0; i < interfaces.length; i++)
                if (Modifier.isPublic(interfaces[i].getModifiers()))
                    populateMethodCacheWith(methodCache, interfaces[i]);
        return methodCache;

  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message