Spróbuj tego:
def cl = Class.forName("org.package.Foo")
cl.get(1)
trochę dłużej, ale powinno działać.
Jeśli chcesz utworzyć kod podobny do przełącznika dla metod statycznych, proponuję utworzyć instancje klas (nawet jeśli mają tylko statyczne metody) i zapisać instancje na mapie. Następnie można użyć jednej z nich, aby wybrać jedną z nich.
[EDIT]"$name"
to GString
i jako takie ważne oświadczenie. "$name".foo()
oznacza „wywołać metodę foo()
klasy GString
[EDIT2] Przy użyciu pojemnika internetową (jak Grails), trzeba określić classloader Istnieją dwie opcje:..
Class.forName("com.acme.MyClass", true, Thread.currentThread().contextClassLoader)
lub
Class.forName("com.acme.MyClass", true, getClass().classLoader)
pierwsza opcja będzie działać tylko w kontekście internetowej, drugie podejście działa również dla testów jednostkowych. zależy to od tego, że można zwykle użyj tego samego programu ładującego klasy co klasa, która wywołuje forName()
.
Jeśli masz problemy, a następnie użyć pierwszą opcję i ustaw contextClassLoader
w badanej jednostki:
def orig = Thread.currentThread().contextClassLoader
try {
Thread.currentThread().contextClassLoader = getClass().classLoader
... test ...
} finally {
Thread.currentThread().contextClassLoader = orig
}
zajęcia nie otrzymują "wywołania" - tylko metody. Do czego dokładnie chcesz się odwołać? chcesz zrobić coś podobnego do MyOwnClass.static_property()? lub myInstanceOfClass.methodName()? – Chii
Przypuszczam, że chce wywołać statyczną metodę na zajęciach. –
Chcę wywołać metodę statyczną na klasie, klasy I, której nie znam do czasu wykonywania. Wiem, że sposobem Java jest użycie Class.forName, był po prostu ciekawy, czy istnieje sposób Groovy to zrobić, jak ich jest dla metod. –