Consider the following snippet -
println String.class
The output is -
class java.lang.String
I was expecting some subclass of String since it contains many members that are not a part of the Java class. For example -
println String.methods.size()
methods is not a member of the Java class.
How does this magic happen?
解决方案
Groovy has a metaclass registry. When you call a method on a class the registry is inspected to see if a metaClass extension method exists for that class instance.
From the standard documentation -
Each groovy object has a metaClass that is used to manage the dynamic
nature of the language. This class intercepts calls to groovy objects
to ensure that the appropriate grooviness can be added. Source