0
동적으로 기본 메소드를 호출 할 수있는 방법은 다음과 같은 것을 알아 냈 :자바 반사 통화 기본 방법은 이전 글에서
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' 메소드에 대한 인수. 위의 코드는 호출 핸들러 안에 있습니다. –