Description
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()
}
then set up velocity excute template code:
context.put("testBean", new TestBean());
System.out.println(evaluate("$testBean.getName()"));
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()))
Class [] interfaces = classToReflect.getInterfaces();
for (int i = 0; i < interfaces.length; i++)
{
if (Modifier.isPublic(interfaces[i].getModifiers()))
}
}
return methodCache;
}
Attachments
Issue Links
- is duplicated by
-
VELOCITY-761 Can not reference a property declared in a super-interface and implemented in a non-public class
- Closed