[ https://issues.apache.org/jira/browse/VELOCITY-924?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17011805#comment-17011805 ]
Thomas Mortagne edited comment on VELOCITY-924 at 1/9/20 1:30 PM: ------------------------------------------------------------------ I just built a SNAPSHOT of Velocity trunk and while I don't get any error anymore the new behavior is that it find no method at all instead of the wrong one so still not great. For example in my use case it should call TestClass#getName() but it does not find this method. was (Author: tmortagne): I just built a SNAPSHOT of Velocity trunk and while I don't get any error anymore the new behavior is that it find no method at all instead of the wrong one. > Bad cache handling for java.lang.Class methods > ---------------------------------------------- > > Key: VELOCITY-924 > URL: https://issues.apache.org/jira/browse/VELOCITY-924 > Project: Velocity > Issue Type: Bug > Components: Engine > Affects Versions: 2.2 > Reporter: Thomas Mortagne > Assignee: Claude Brisson > Priority: Blocker > Labels: regression > Fix For: 2.2 > > > Requirement: > A binding $var containing an object which class (org.xwiki.MyClass) > implementing a {{String getName()}} method. > The following code: > {code} > $var.class.getName() > $var.getName() > {code} > fail with: > {noformat} > Caused by: org.apache.velocity.exception.MethodInvocationException: > Invocation of method 'getName' in class org.xwiki.MyClass threw exception > java.lang.IllegalArgumentException: object is not an instance of declaring > class at mytemplaye[line 1, column 26] > at > org.apache.velocity.runtime.parser.node.ASTMethod.handleInvocationException(ASTMethod.java:306) > at > org.apache.velocity.runtime.parser.node.ASTMethod.execute(ASTMethod.java:239) > at > org.apache.velocity.runtime.parser.node.ASTReference.execute(ASTReference.java:369) > at > org.apache.velocity.runtime.parser.node.ASTReference.render(ASTReference.java:490) > at > org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:423) > at org.apache.velocity.Template.merge(Template.java:358) > at org.apache.velocity.Template.merge(Template.java:262) > at > org.xwiki.velocity.internal.DefaultVelocityEngine.evaluate(DefaultVelocityEngine.java:271) > ... 69 more > Caused by: java.lang.IllegalArgumentException: object is not an instance of > declaring class > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > at java.lang.reflect.Method.invoke(Method.java:498) > at > org.apache.velocity.util.introspection.UberspectImpl$VelMethodImpl.doInvoke(UberspectImpl.java:565) > at > org.apache.velocity.util.introspection.UberspectImpl$VelMethodImpl.invoke(UberspectImpl.java:548) > at > org.apache.velocity.runtime.parser.node.ASTMethod.execute(ASTMethod.java:219) > ... 75 more > {noformat} > The reason is that ClassUtils.getMethod cache does not make any difference > between an instance of Class<org.xwiki.MyClass> and and instance of > org.xwiki.MyClass so when ASTMethod#execute ask for the second getName() it > end up with Class#getName() instead of MyClass#getName(). > Was working fine in 1.7. -- This message was sent by Atlassian Jira (v8.3.4#803005) --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@velocity.apache.org For additional commands, e-mail: dev-h...@velocity.apache.org