velocity-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Eric Ballet Baz (JIRA)" <...@velocity.apache.org>
Subject [jira] Commented: (VELOCITY-579) Can not access a member of class X with modifiers "public" even if method is public
Date Tue, 06 May 2008 14:36:56 GMT

    [ https://issues.apache.org/jira/browse/VELOCITY-579?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12594595#action_12594595
] 

Eric Ballet Baz commented on VELOCITY-579:
------------------------------------------

Yes it worked in Velocity 1.4 and stopped working in 1.5.

To reproduce the problem :

1) Add to your classpath the library "tools.jar" which you can find in the lib directory of
the Sun JDK

2) In your java test program add these two lines :

com.sun.javadoc.MethodDoc methodDoc = new com.sun.tools.javadoc.MethodDocImpl(null, null);
context.put("methodDoc", methodDoc);

3) In your .vm template simply define :

$methodDoc.tags()

4) Run your test program

You should see something like :

ASTMethod.execute() : exception invoking method 'tags' in class com.sun.tools.javadoc.MethodDocImpl
java.lang.IllegalAccessException: Class org.apache.velocity.util.introspection.UberspectImpl$VelMethodImpl
can
 not access a member of class com.sun.tools.javadoc.DocImpl with modifiers "public"
        at sun.reflect.Reflection.ensureMemberAccess(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.apache.velocity.util.introspection.UberspectImpl$VelMethodImpl.invoke(UberspectImpl.java:295)
        at org.apache.velocity.runtime.parser.node.ASTMethod.execute(ASTMethod.java:245)
        at org.apache.velocity.runtime.parser.node.ASTReference.execute(ASTReference.java:203)
        at org.apache.velocity.runtime.parser.node.ASTReference.render(ASTReference.java:294)
        at org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:318)
        at org.apache.velocity.Template.merge(Template.java:254)
        at Example.<init>(Example.java:100)
        at Example.main(Example.java:129)


But the method tags() is very public ! it's defined in the following interface :
http://java.sun.com/j2se/1.5.0/docs/guide/javadoc/doclet/spec/com/sun/javadoc/Doc.html#tags()
and implemented as a public method in DocImpl.

The problem here is that the class DocImpl is not public even if she implements public methods,
this class is package protected :

abstract class DocImpl implements Doc, Comparable

This is exactly the same problem with the Weblogic implementation of javax.servlet.http.HttpSession
which is not a public class, even if its methods are public! 

> Can not access a member of class X with modifiers "public" even if method is public
> -----------------------------------------------------------------------------------
>
>                 Key: VELOCITY-579
>                 URL: https://issues.apache.org/jira/browse/VELOCITY-579
>             Project: Velocity
>          Issue Type: Bug
>          Components: Engine
>    Affects Versions: 1.5
>            Reporter: Eric Ballet Baz
>            Priority: Blocker
>
> When upgrading from 1.4 to 1.5 none of my template is working anymore.
> For example :
>   [javadoc]  ERROR [console:logVelocityMessage] - ASTMethod.execute() : exception invoking
method 'tags' in class com.sun.tools.javadoc.MethodDocImpl
>   [javadoc]  ERROR [console:logVelocityMessage] - java.lang.IllegalAccessException: Class
org.apache.velocity.util.introspection.UberspectImpl$VelMethodImpl can not access a member
of class com.sun.tools.javadoc.DocImpl with modifiers "public"
> The method 'tags()' is public in com.sun.javadoc.Doc, but the implementation is package
protected. So the java.lang.reflect.Method object is well returned by the org.apache.velocity.util.introspection.Introspector
but not accessible from templates.
> The same errors occured for example for javax.servlet.http.HttpSession Weblogic's implementation
which is not public, but methods are !
> It's not possible to wrap all objects javax.servlet.http.HttpSession into public implementations
... 
> The Introspector could call method.setAccessible(true) before returning Method object
: if this method has been found, it is a public method !

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@velocity.apache.org
For additional commands, e-mail: dev-help@velocity.apache.org


Mime
View raw message