Groovy中是否自动定义了访问器/更改器?

Lit*_*ild 2 groovy

在使用Groovy In ActionGroovy处理Java Bean的部分中,我找到了此脚本(稍作修改):

class Book{
  String title
}
def groovyBook = new Book()
// explicit way
groovyBook.setTitle('What the heck, really ?')
println groovyBook.getTitle()
// short-hand way
groovyBook.title = 'I am so confused'
println groovyBook.title  
Run Code Online (Sandbox Code Playgroud)

该类中没有此类方法,Book那么它如何工作?

tim*_*tes 5

是的,它们是自动定义的,呼叫book.title实际上是在呼叫book.getTitle()

参见http://groovy.codehaus.org/Groovy+Beans

您可以使用以下脚本查看此操作:

def debug( clazz ) {
    println '----'
    clazz.metaClass.methods.findAll { it.name.endsWith( 'Name' ) || it.name.endsWith( 'Age' ) }.each { println it }
}

class A {
    String name
    int age
}
debug( A )
// Prints
// public int A.getAge()
// public java.lang.String A.getName()
// public void A.setAge(int)
// public void A.setName(java.lang.String)

// Make name final
class B {
    final String name
    int age
}
debug( B )
// Prints
// public int B.getAge()
// public java.lang.String B.getName()
// public void B.setAge(int)

// Make name private
class C {
    private String name
    int age
}
debug( C )
// Prints
// public int C.getAge()
// public void C.setAge(int)

// Try protected
class D {
    protected String name
    int age
}
debug( D )
// Prints
// public int D.getAge()
// public void D.setAge(int)

// And public?
class E {
    public String name
    int age
}
debug( E )
// Prints
// public int E.getAge()
// public void E.setAge(int)
Run Code Online (Sandbox Code Playgroud)