2016-06-11 69 views
0

我想通了,動態調用默認方法的方法如下:Java反射調用默認的方法從以前的帖子

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); 

這工作完全正常;但是,如果調用來自覆蓋特定方法的派生接口,那麼上面的代碼將調用基接口的方法。

所以,問題是在基本接口上有一個默認方法,比方說'void fire()',並且子接口覆蓋了這個方法,那麼調用默認方法的機制,調用總是隻有基類中的一個。

+0

第一行的*方法來自哪裏? – waltersu

+0

@waltersu它是調用處理程序的'invoke'方法的參數。上面的代碼在調用處理程序中。 –

回答

0

只是爲了更新,我設法以不同的方式解決它。 因此,基本上我通過其代理跟蹤當前對象,因此我通過反射得到了正確的(派生)方法,並對其執行MethodLookup,這工作得很好。 謝謝!