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()',並且子接口覆蓋了這個方法,那麼調用默認方法的機制,調用總是隻有基類中的一個。
第一行的*方法來自哪裏? – waltersu
@waltersu它是調用處理程序的'invoke'方法的參數。上面的代碼在調用處理程序中。 –