'u kullanarak Groovy'de arabirimi uygulama Groovy, Java arabirimleriyle uğraşmak ve bunları uygulamak için bazı gerçekten düzgün dil özellikleri sunar, ancak sıkışmış gibi görünüyorum.Dinamik olarak invokeMethod
GroovyInterceptable.invokeMethod kullanarak Groovy sınıfında bir Arabirimi dinamik olarak uygulamak ve tüm arabirimdeki tüm yöntem çağrılarını durdurmak istiyorum. Kapatma çalışıyor dönen
public interface TestInterface
{
public void doBla();
public String hello(String world);
}
import groovy.lang.GroovyInterceptable;
class GormInterfaceDispatcher implements GroovyInterceptable
{
def invokeMethod(String name, args) {
System.out.println ("Beginning $name with $args")
def metaMethod = metaClass.getMetaMethod(name, args)
def result = null
if(!metaMethod)
{
// Do something cool here with the method call
}
else
result = metaMethod.invoke(this, args)
System.out.println ("Completed $name")
return result
}
TestInterface getFromClosure()
{
// This works, but how do I get the method name from here?
// I find that even more elegant than using invokeMethod
return { Object[] args -> System.out.println "An unknown method called with $args" }.asType(TestInterface.class)
}
TestInterface getThisAsInterface()
{
// I'm using asType because I won't know the interfaces
// This returns null
return this.asType(TestInterface.class)
}
public static void main(String[] args)
{
def gid = new GormInterfaceDispatcher()
TestInterface ti = gid.getFromClosure()
assert ti != null
ti.doBla() // Works
TestInterface ti2 = gid.getThisAsInterface()
assert ti2 != null // Assertion failed
ti2.doBla()
}
}
ama orada çağrılan yöntemin adını bulmak için bir yol çözemedim: İşte ben bugüne kadar ne çalıştığımız.
Bu referansın kendisinde bir Proxy oluşturmaya çalışarak (yöntem çağrıları invokeMethod çağırır) null değerini döndürür.
Çok teşekkürler, bir çekicilik gibi çalışır ve temiz görünüyor ve hala tüm üye değişkenleri ve yöntemleri erişebilirsiniz. – Daff
Bu, aşırı yüklü yöntemlere sahip arayüzler için işe yaramıyor. –