2016-06-11 10 views
0

aus früheren Veröffentlichungen dachte ich, dass der Weg aus, um dynamisch eine Standard-Methode aufrufen, ist die folgende:Java Reflexion Aufruf Standardmethode von abgeleiteten Klasse

final Class<?> declaringClass = method.getDeclaringClass(); 

final Constructor<Lookup> constructor = 
MethodHandles.Lookup.class.getDeclaredConstructor(Class.class, int.class); 

constructor.setAccessible(true); 

final MethodHandles.Lookup defaultMethodLookup = 
       constructor.newInstance(declaringClass, MethodHandles.Lookup.PRIVATE); 

return defaultMethodLookup 
      .unreflectSpecial(method, declaringClass) 
      .bindTo(proxy) 
      .invokeWithArguments(args); 

Das funktioniert völlig in Ordnung; Wenn der Aufruf jedoch von einer abgeleiteten Schnittstelle stammt, die die spezifische Methode überschreibt, ruft der obige Code die Methode der Basisschnittstelle auf.

Also, das Problem ist in dem Fall, dass es eine Standardmethode auf einer Basisschnittstelle gibt, sagen wir 'void fire()', und eine Subschnittstelle überschreibt diese Methode, dann ruft der Mechanismus, der die Standardmethoden aufruft, auf immer nur der eine auf der Basisklasse.

+0

Woher kommt die * Methode * in der ersten Zeile? – waltersu

+0

@waltersu ist ein Argument für die 'invoke'-Methode eines Aufruf-Handlers. Der obige Code befindet sich in einem Aufruf-Handler. –

Antwort

0

Nur für das Update habe ich es anders lösen. Also, im Grunde verfolge ich das aktuelle Objekt durch seinen Proxy, daher habe ich die richtige (abgeleitete) Methode durch Reflektion bekommen und das MethodLookup darauf ausgeführt, das hat gut funktioniert. Danke!