2014-11-05 3 views
3

Я хотел бы вызвать метод, имя которого содержит пространство в статическом контексте, но оно не работает. Любые предложения?groovy метод вызова имя содержит специальный символ

class Test2 { 
    void "test"() { 
     "test a"() 
    } 

    void "test a"() { 
     println "test a" 
    } 

    public static void main(String[] args) { 
     def t = new Test2() 
     t."test"() //it works 
     t."test a"() //raise error, Illegal class name "Test2$test a" in class file Test2$test a 
    } 
} 

G:\tmp\groovy\gp1\src>groovy -version 
Groovy Version: 2.3.2 JVM: 1.7.0_02 Vendor: Oracle Corporation OS: Windows 7 

G:\tmp\groovy\gp1\src>groovy Test2.groovy 
Test1.main 
Caught: java.lang.ClassFormatError: Illegal class name "Test2$test a" in class file Test2$test a 
java.lang.ClassFormatError: Illegal class name "Test2$test a" in class file Test2$test a 
     at Test2.main(Test2.groovy:15) 

ответ

1

Что относительно invokeMethod?

class Invokes { 

    def "test a"() { 
     "test a" 
    } 

    static main(args) { 
     def t = new Invokes() 
     assert t.invokeMethod("test a", null) == "test a" 
    } 
} 
1

Она будет работать следующим образом:

class Test2 { 

    void "test a"() { 
     println "test a" 
    } 

    public static void main(String[] args) { 
     def t = new Test2() 
     def v = 'test a' 
     t."$v"() 
    } 
} 

Как описано here и here, но не знаю, почему Ваш пример не работает.

+3

Я думаю, что это статический контекст, добавив 'недействительным запуска)' метод (который вызывает 'this.'test а '()' работает хорошо, когда' метод main' называет 't.run() ' –

+0

@tim_yates с любопытством, это не работает:' static main (args) {def t = new Invokes(); t.run (t)} def run (self) {self. "test a"()} ' – Will

Смежные вопросы