[ 
https://issues.apache.org/jira/browse/GROOVY-8350?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16204657#comment-16204657
 ] 

Eric Milles edited comment on GROOVY-8350 at 10/14/17 3:14 PM:
---------------------------------------------------------------

I did some additional research on this one and answered a lot of my own 
questions.  Would it be possible to update the language docs to reflect this 
(or point me to the section where it is described)?

1. Class literals (with and without ".class") and class instances are 
interchangeable (at least in dynamic Groovy); they all provide access to static 
members of the referent type
  {{System.getProperties()}}, {{System.class.getProperties()}}, and {{def 
systemClass = System _or any other source of class instance_; 
systemClass.getProperties()}} all execute fine.

2. Point (1) extends to method pointers as well
  {{System.&currentTimeMillis}}, {{System.class.currentTimeMillis}}, and {{def 
systemClass = ...;  systemClass.&currentTimeMillis}} all produce a usable 
closure.

3. Point (1) extends to property syntax as well
  {{System.properties}}, {{System.class.properties}}, and {{def systemClass = 
...; systemClass.properties}} should all call {{System.getProperties()}}

4. Point (1) extends to Class members
  {{System.getCanonicalName()}}, {{System.class.getCanonicalName()}} and {{def 
systemClass = ...;  systemClass.getCanonicalName()}} all return 
"java.lang.System"

5. Class static methods can be called directly from static initializers
{code}
  class C {
    static {
      def name = getCanonicalName() // equivalent to C.getCanonicalName()
    }
  }
{code}

Therefore, I can conclude that {{System.getClass()}} is actually 
{{(System.class).getClass()}}, which is an instance of {{Class<Class>}}.


was (Author: emilles):
I did some additional research on this one and answered a lot of my own 
questions.  Would it be possible to update the language docs to reflect this 
(or point me to the section where it is described)?

1. Class literals (with and without ".class") and class instances are 
interchangeable (at least in dynamic Groovy); they all provide access to static 
members of the referent type
  {{System.getProperties()}}, {{System.class.getProperties()}}, and {{def 
systemClass = System _or any other source of class instance_; 
systemClass.getProperties()}} all execute fine.

2. Point (1) extends to method pointers as well
  {{System.&currentTimeMillis}}, {{System.class.currentTimeMillis}}, and {{def 
systemClass = ...;  systemClass.&currentTimeMillis}} all produce a usable 
closure.

3. Point (1) extends to property syntax as well
  {{System.properties}}, {{System.class.properties}}, and {{def systemClass = 
...; systemClass.properties}} should all call {{System.getProperties()}}

4. Point (1) extends to Class members
  {{System.getCanonicalName()}}, {{System.class.getCanonicalName()}} and {{def 
systemClass = ...;  systemClass.getCanonicalName()}} all return 
"java.lang.System"

5. Class static methods can be called directly from static initializers
{code}
  class C {
    static {
      def name = getCanonicalName() // equivalent to C.getCanonicalName()
    }
  }
{code}

Therefore, I can conclude that {{System.getClass()}} is actually 
{{(System.class).getClass()}}.

> Class expressions with and without ".class"
> -------------------------------------------
>
>                 Key: GROOVY-8350
>                 URL: https://issues.apache.org/jira/browse/GROOVY-8350
>             Project: Groovy
>          Issue Type: Documentation
>            Reporter: Eric Milles
>            Priority: Minor
>
> This seems like a bug (but it could just be a clarification in the 
> documentation).  And is seems related to GROOVY-8152, GROOVY-8153, and 
> GROOVY-8154.
> {{System.currentTimeMillis()}} is your typical static call.
> {{System.getClass().currentTimeMillis()}} results in a 
> MissingMethodException, as it should.
> However, {{System.class.currentTimeMillis()}} and {{def sys = System.class; 
> sys.currentTimeMillis()}} both compile and execute fine.  I would expect a 
> MissingMethodException for these as well.
> Is there some trick where methodMissing on class instance can find the static 
> method or something?  My Java experience says no {{currentTimeMillis}} method 
> on {{Class}}.



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to